I am still a beginner in mySQL. I have been trying to figure out a trigger for my project but can't come up with a solution. Here is what I am trying to do:
When an order is made I want a trigger to update the inventory. The bump here is that orders can have many products and those products are composed of different elements of the inventory. Here is how I tried it maybe it can help you understand the idea.
create trigger subtract_inv
after insert on order_details for each row
begin
update inventory
set Inv_qty = Inv_qty - (order_details.Order_details_qty * recipes.Requiered_qty)
where Products_Prod_ID = NEW.Products_Prod_ID and inventory.Inv_ID = recipes.Inventory_Inv_ID;
end$$
delimiter ;
Here are the 3 tables
-- -----------------------------------------------------
-- Table `McDo`.`Order_details`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `McDo`.`Order_details` (
`orders_Order_id` INT NOT NULL,
`Products_Prod_ID` INT NOT NULL,
`Order_details_qty` INT NULL,
PRIMARY KEY (`orders_Order_id`, `Products_Prod_ID`),
INDEX `fk_orders_has_Products_Products1_idx` (`Products_Prod_ID`
ASC) VISIBLE,
INDEX `fk_Order_details_orders1_idx` (`orders_Order_id` ASC)
VISIBLE,
CONSTRAINT `fk_orders_has_Products_Products1`
FOREIGN KEY (`Products_Prod_ID`)
REFERENCES `McDo`.`Products` (`Prod_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Order_details_orders1`
FOREIGN KEY (`orders_Order_id`)
REFERENCES `McDo`.`Orders` (`Order_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `McDo`.`Inventory`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `McDo`.`Inventory` (
`Inv_ID` INT NOT NULL,
`Inv_type` VARCHAR(1) NOT NULL,
`Inv_name` VARCHAR(45) NULL,
`Inv_qty` INT NULL,
`Inv_price_unit` DECIMAL(20,2) NULL,
PRIMARY KEY (`Inv_ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `McDo`.`Recipes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `McDo`.`Recipes` (
`Products_Prod_ID` INT NOT NULL,
`Inventory_Inv_ID` INT NOT NULL,
`Requiered_qty` INT NULL,
PRIMARY KEY (`Products_Prod_ID`, `Inventory_Inv_ID`),
INDEX `fk_Products_has_Inventory_Products1_idx` (`Products_Prod_ID` ASC)
VISIBLE,
INDEX `fk_Products_has_Inventory_Inventory1_idx` (`Inventory_Inv_ID`
ASC) VISIBLE,
CONSTRAINT `fk_Products_has_Inventory_Products1`
FOREIGN KEY (`Products_Prod_ID`)
REFERENCES `McDo`.`Products` (`Prod_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Products_has_Inventory_Inventory1`
FOREIGN KEY (`Inventory_Inv_ID`)
REFERENCES `McDo`.`Inventory` (`Inv_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
and here a sample of the data
-- -----------------------------------------------------
-- Data for table `McDo`.`Recipes`
-- -----------------------------------------------------
START TRANSACTION;
USE `McDo`;
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 102, 3);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 103, 2);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 112, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 110, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 111, 2);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 114, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 113, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 108, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 101, 2);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 111, 2);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 103, 2);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 107, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 113, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 114, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 108, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 109, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (301, 204, 1);
INSERT INTO `McDo`.`Recipes` (`Products_Prod_ID`, `Inventory_Inv_ID`, `Requiered_qty`) VALUES (302, 202, 1);
-- -----------------------------------------------------
-- Data for table `McDo`.`Inventory`
-- -----------------------------------------------------
START TRANSACTION;
USE `McDo`;
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (101, 'C', 'regular bun', 1000, 0.07);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (102, 'C', 'sesame bun', 1000, 0.12);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (103, 'C', 'beef patty', 1000, 0.35);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (107, 'C', 'ketchup sachet', 5000, 0.02);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (108, 'C', 'seasoning sachet', 5000, 0.01);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (109, 'C', 'mustard sachet', 5000, 0.01);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (110, 'C', 'big mac sauce sachet', 5000, 0.04);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (111, 'C', 'cheese slice', 2000, 0.05);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (112, 'C', 'precut letuce', 1500, 0.02);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (113, 'C', 'precut onion', 1500, 0.01);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (114, 'C', 'precut pickle', 1500, 0.01);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (202, 'N', 'mc double wrapping', 1000, 0.01);
INSERT INTO `McDo`.`Inventory` (`Inv_ID`, `Inv_type`, `Inv_name`, `Inv_qty`, `Inv_price_unit`) VALUES (204, 'N', 'big mac box', 1000, 0.02);
and orders can look like:
1000,301,2;
1000,302,1;
1001,301,2;
1002,302,3;
You are allowed to use joins in an update query so perhaps this
delimiter $$
CREATE TRIGGER `subtract_inv` AFTER INSERT ON `order_details` FOR EACH ROW
begin
update inventory join
(select r.inventory_inv_id rinvid,new.order_details_qty * r.Requiered_qty adjustment
from recipes r join inventory i on i.inv_id = r.inventory_inv_id
where r.products_prod_id = new.products_prod_id) s
set inv_qty = inv_qty - s.adjustment
where inventory.Inv_ID = s.rinvid;
end $$
delimiter ;
Related
I'm trying to add a table in a MySQL database. The database is called "stocks". The odd thing I'm encountering is that while I can create the table, I can't add any fields to it other than the primary key.
Code is below. Please note that I can create the "person" table and all of its fields and populate all fields without a problem. The "quotes" table and "person_quotes" table can be created, too, but I cannot populate them with any fields other than the primary key. Anyone have any idea what's going on?
/* delete tables if they exist already - ensuring a clean db */
DROP TABLE IF EXISTS stocks.person CASCADE;
DROP TABLE IF EXISTS stocks.quotes CASCADE;
DROP TABLE IF EXISTS stocks.person_quotes CASCADE;
/** creates a table to store a list of persons */
CREATE TABLE stocks.person
(
person_ID INT PRIMARY KEY NOT NULL,
first_name VARCHAR(256) NOT NULL,
last_name VARCHAR(256) NOT NULL,
birth_date DATETIME NOT NULL
);
/* creates a table to store a list of quotes */
CREATE TABLE stocks.quotes
(
quotes_ID INT PRIMARY KEY NOT NULL,
symbol VARCHAR(256) NOT NULL,
quote_time DATETIME NOT NULL,
price DECIMAL NOT NULL
);
/** A list of people and their quotes */
CREATE TABLE stocks.person_quotes
(
person_quote_ID INT PRIMARY KEY NOT NULL,
person_id INT NOT NULL,
quotes_id INT NOT NULL,
FOREIGN KEY (person_id) REFERENCES person (person_ID),
FOREIGN KEY (quotes_id) REFERENCES quotes (quotes_ID)
);
/** add some sample data */
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (1, 'GOOG', '2018-09-21 00:00:01', 85);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (2, 'GOOG', '2018-09-21 00:00:59', 95);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (3, 'GOOG', '2018-09-21 01:00:01', 105);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (4, 'GOOG', '2018-09-21 02:00:01', 115);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (5, 'GOOG', '2018-09-21 03:00:01', 125);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (6, 'GOOG', '2018-09-22 00:00:01', 135);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (7, 'GOOG', '2018-09-22 01:00:01', 145);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (8, 'GOOG', '2018-09-22 02:00:01', 155);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (9, 'GOOG', '2018-09-22 03:00:01', 165);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (10, 'GOOG', '2018-09-23 00:00:01', 175);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (11, 'GOOG', '2018-09-24 00:00:01', 185);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (12, 'GOOG', '2018-09-25 00:00:01', 195);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (13, 'GOOG', '2018-09-26 00:00:01', 205);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (14, 'GOOG', '2018-09-27 00:00:01', 215);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (15, 'GOOG', '2018-09-28 00:00:01', 225);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (16, 'GOOG', '2018-09-29 00:00:01', 235);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (17, 'GOOG', '2018-09-30 00:00:01', 245);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (18, 'GOOG', '2018-09-30 00:00:01', 255);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (19, 'GOOG', '2018-10-01 00:00:01', 265);
INSERT INTO quotes (quotes_ID,symbol,quote_time,price) VALUES (20, 'GOOG', '2018-10-02 00:00:01', 275);
INSERT INTO person (person_ID,first_name,last_name,birth_date) VALUES (1, 'Drew', 'Hope', '1999/10/10');
INSERT INTO person (person_ID,first_name,last_name,birth_date) VALUES (2, 'Lang', 'Heckman', '1959/11/11');
INSERT INTO person (person_ID,first_name,last_name,birth_date) VALUES (3, 'Lucy', 'Jones', '2010/1/1');
INSERT INTO person (person_ID,first_name,last_name,birth_date) VALUES (4, 'Stew', 'Hammer', '1990/3/28');
INSERT INTO person (person_ID,first_name,last_name,birth_date) VALUES (5, 'Dan', 'Lane', '1986/4/18');
INSERT INTO person (person_ID,first_name,last_name,birth_date) VALUES (6, 'James', 'Marrese', '1915/10/18');
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (1, 1, 2);
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (2, 1, 1);
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (3, 2, 1);
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (4, 3, 1);
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (5, 3, 3);
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (6, 3, 4);
INSERT INTO person_quotes (person_quotes_ID, person_id, quotes_id) VALUES (7, 4, 7);
CREATE TABLE `z` (
`a` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`a`),
KEY `b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `test`.`z` (`a`, `b`) VALUES (1, 1);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (3, 1);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (5, 3);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (7, 6);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (10, 8);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (20, 30);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (50, 60);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (45, 90);
INSERT INTO `test`.`z` (`a`, `b`) VALUES (2, 99);
transaction_isolation = REPEATABLE-READ
tx_isolation = REPEATABLE-READ
SESSION 1
begin;
select * from z where b = 60 for update;
SESSION 2
begin;
insert into z select 4, 90; /* why this can't be insert? */
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
insert into z select 46, 90; /* But this can be insert? */
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
As the above step:
one can be insert, but the other can't be. they're all the same value - 90.
Yes, this is a gap lock.
The two inserts are not actually trying to insert the same value, because secondary indexes also store a copy of the primary key at the end (that is how an index lookup finds the original row if more columns are referenced than are in the index).
In the index b, the rows in question would be sorted like this.
b a
60, 50
90, 4
90, 45
90, 46
From this illustration, you can see that (4,90) belongs in the gap immediately after (60,50), but (46,90) is not in that gap.
I'm really frusterated with these codes and I can't find where the errors are..
SSH secure shell .txt file with the error codes:
Table created.
SQL>
SQL> CREATE TABLE Order_mys (
2 OrderID NUMBER(3) NOT NULL,
3 OrderDate DATE NOT NULL,
4 CustID CHAR(5) NOT NULL,
5 PRIMARY KEY (OrderID),
6 FOREIGN KEY (CustID) REFERENCES Customer_mys
7 ) ;
CREATE TABLE Order_mys (
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
SQL>
SQL> CREATE TABLE Product_mys (
2 ProductID NUMBER(3) NOT NULL,
3 ProductName VARCHAR(30) NOT NULL,
4 CatID Number(3) NOT NULL,
5 PRIMARY KEY (ProductID),
6 FOREIGN KEY (CatID) REFERENCES Category_mys
7 ) ;
CREATE TABLE Product_mys (
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
SQL>
SQL> CREATE TABLE OrderDetail_mys (
2 OrderID NUMBER(3) NOT NULL,
3 ProductID NUMBER(3) NOT NULL,
4 ProductQty NUMBER(4) NOT NULL,
5 ProdcutPrice NUMBER(6,2) NOT NULL,
6 PRIMARY KEY (OrderID, ProductID),
7 FOREIGN KEY (OrderID) REFERENCES Order_mys,
8 FOREIGN KEY (ProductID) REFERENCES Product_mys
9 ) ;
CREATE TABLE OrderDetail_mys (
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
SQL>
SQL>
SQL> DESCRIBE Dept_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPTID NOT NULL NUMBER(3)
DEPTNAME NOT NULL VARCHAR2(20)
SQL> DESCRIBE Commission_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
COMMCLASS NOT NULL CHAR(1)
COMMRATE NOT NULL NUMBER(2,2)
SQL> DESCRIBE Category_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
CATID NOT NULL NUMBER(3)
CATNAME NOT NULL VARCHAR2(20)
SQL> DESCRIBE SalesRep_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
SALESREPID NOT NULL NUMBER(4)
SALESREPFNAME NOT NULL VARCHAR2(20)
SALESREPLNAME NOT NULL VARCHAR2(20)
DEPTID NOT NULL NUMBER(3)
COMMCLASS NOT NULL CHAR(1)
SQL> DESCRIBE Customer_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
CUSTID NOT NULL VARCHAR2(5)
CUSTFNAME NOT NULL VARCHAR2(20)
CUSTLNAME NOT NULL VARCHAR2(20)
CUSTPHONE CHAR(10)
SALESREPID NOT NULL NUMBER(4)
SQL> DESCRIBE Order_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
ORDERID NOT NULL NUMBER(3)
ORDERDATE NOT NULL DATE
CUSTID NOT NULL CHAR(5)
SQL> DESCRIBE Product_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
PRODUCTID NOT NULL NUMBER(3)
PRODUCTNAME NOT NULL VARCHAR2(30)
CATID NOT NULL NUMBER(3)
SQL> DESCRIBE OrderDetail_mys ;
Name Null? Type
----------------------------------------- -------- ----------------------------
ORDERID NOT NULL NUMBER(3)
PRODUCTID NOT NULL NUMBER(3)
PRODUCTQTY NOT NULL NUMBER(4)
PRODCUTPRICE NOT NULL NUMBER(6,2)
SQL>
SQL> --Part II
SQL>
SQL> INSERT INTO Dept_mys
2 VALUES (10, 'Store Sales') ;
1 row created.
SQL>
SQL> INSERT INTO Dept_mys
2 VALUES (14, 'Corp Sales') ;
1 row created.
SQL>
SQL> INSERT INTO Dept_mys
2 VALUES (16, 'Web Sales') ;
1 row created.
SQL>
SQL>
SQL>
SQL> INSERT INTO Commission_mys
2 VALUES (A, .1) ;
VALUES (A, .1)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL> INSERT INTO Commission_mys
2 VALUES (B, .08) ;
VALUES (B, .08)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL> INSERT INTO Commission_mys
2 VALUES (Z, 0) ;
VALUES (Z, 0)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL> INSERT INTO Commission_mys
2 VALUES (C, .05) ;
VALUES (C, .05)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL>
SQL> INSERT INTO Category_mys
2 VALUES (1, 'Hand Tools') ;
1 row created.
SQL>
SQL> INSERT INTO Category_mys
2 VALUES (2, 'power Tools') ;
1 row created.
SQL>
SQL> INSERT INTO Category_mys
2 VALUES (4, 'Fasteners') ;
1 row created.
SQL>
SQL> INSERT INTO Category_mys
2 VALUES (6, 'Misc') ;
1 row created.
SQL>
SQL> INSERT INTO Category_mys
2 VALUES (3, 'Measuring Tools') ;
1 row created.
SQL>
SQL> INSERT INTO Category_mys
2 VALUES (5, 'Hardware') ;
1 row created.
SQL>
SQL>
SQL>
SQL> INSERT INTO SalesRep_mys
2 VALUES (10, 'Alice', 'Jones', 10, 'A') ;
INSERT INTO SalesRep_mys
*
ERROR at line 1:
ORA-02291: integrity constraint (MYS2306.SYS_C00966867) violated - parent key
not found
SQL>
SQL> INSERT INTO SalesRep_mys
2 VALUES (12, 'Greg', 'Taylor', 14, 'B') ;
INSERT INTO SalesRep_mys
*
ERROR at line 1:
ORA-02291: integrity constraint (MYS2306.SYS_C00966867) violated - parent key
not found
SQL>
SQL> INSERT INTO SalesRep_mys
2 VALUES (14, 'Sara', 'Day', 10, 'Z') ;
INSERT INTO SalesRep_mys
*
ERROR at line 1:
ORA-02291: integrity constraint (MYS2306.SYS_C00966867) violated - parent key
not found
SQL>
SQL> INSERT INTO SalesRep_mys
2 VALUES (8, 'Kay', 'Price', 14, 'C') ;
INSERT INTO SalesRep_mys
*
ERROR at line 1:
ORA-02291: integrity constraint (MYS2306.SYS_C00966867) violated - parent key
not found
SQL>
SQL> INSERT INTO SalesRep_mys
2 VALUES (20, 'Bob', 'Jackson', 10, 'B') ;
INSERT INTO SalesRep_mys
*
ERROR at line 1:
ORA-02291: integrity constraint (MYS2306.SYS_C00966867) violated - parent key
not found
SQL>
SQL> INSERT INTO SalesRep_mys
2 VALUES (22, 'Micah', 'Moore', 16, 'Z') ;
INSERT INTO SalesRep_mys
*
ERROR at line 1:
ORA-02291: integrity constraint (MYS2306.SYS_C00966867) violated - parent key
not found
SQL>
SQL>
SQL>
SQL> INSERT INTO Customer_mys
2 VALUES (S100, 'John', 'Smith', '5551212', 10) ;
VALUES (S100, 'John', 'Smith', '5551212', 10)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL> INSERT INTO Customer_mys
2 VALUES (A120, 'Jane', 'Adams', '817555', 14) ;
VALUES (A120, 'Jane', 'Adams', '817555', 14)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL> INSERT INTO Customer_mys
2 VALUES (J090, 'Tim', 'Jones', NULL, 10) ;
VALUES (J090, 'Tim', 'Jones', NULL, 10)
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL>
SQL> INSERT INTO Customer_mys
2 VALUES (B200, 'Ann', 'Brown', '972555', 14) ;
VALUES (B200, 'Ann', 'Brown', '972555', 14)
*
ERROR at line 2:
ORA-00984: column not allowed here
Here's the tables that I did with the relationships, foreign key, inserts
DROP TABLE Customer_mys ;
DROP TABLE SalesRep_mys ;
DROP TABLE Category_mys ;
DROP TABLE Commission_mys ;
DROP TABLE Dept_mys ;
--part I
CREATE TABLE Dept_mys (
DeptID Number(3) NOT NULL,
DeptName VARCHAR(20) NOT NULL,
PRIMARY KEY (DeptID)
) ;
CREATE TABLE Commission_mys (
CommClass CHAR(1) NOT NULL,
CommRate Number(2,2) NOT NULL,
PRIMARY KEY (CommClass)
) ;
CREATE TABLE Category_mys (
CatID Number(3) NOT NULL,
catName VARCHAR(20) NOT NULL,
PRIMARY KEY (CatID)
) ;
CREATE TABLE SalesRep_mys (
SalesRepID NUMBER(4) NOT NULL,
SalesRepFName VARCHAR(20) NOT NULL,
SalesRepLName VARCHAR(20) NOT NULL,
DeptID NUMBER(3) NOT NULL,
CommClass CHAR(1) NOT NULL,
PRIMARY KEY (SalesRepID),
FOREIGN KEY (DeptID) REFERENCES Dept_mys,
FOREIGN KEY (CommClass) REFERENCES Commission_mys
) ;
CREATE TABLE Customer_mys (
CustID VARCHAR(5) NOT NULL,
CustFName VARCHAR(20) NOT NULL,
CustLName VARCHAR(20) NOT NULL,
CustPhone CHAR(10),
SalesRepID NUMBER(4) NOT NULL,
PRIMARY KEY (CustID),
FOREIGN KEY (SalesRepID) REFERENCES Customer_mys
) ;
CREATE TABLE Order_mys (
OrderID NUMBER(3) NOT NULL,
OrderDate DATE NOT NULL,
CustID CHAR(5) NOT NULL,
PRIMARY KEY (OrderID),
FOREIGN KEY (CustID) REFERENCES Customer_mys
) ;
CREATE TABLE Product_mys (
ProductID NUMBER(3) NOT NULL,
ProductName VARCHAR(30) NOT NULL,
CatID Number(3) NOT NULL,
PRIMARY KEY (ProductID),
FOREIGN KEY (CatID) REFERENCES Category_mys
) ;
CREATE TABLE OrderDetail_mys (
OrderID NUMBER(3) NOT NULL,
ProductID NUMBER(3) NOT NULL,
ProductQty NUMBER(4) NOT NULL,
ProdcutPrice NUMBER(6,2) NOT NULL,
PRIMARY KEY (OrderID, ProductID),
FOREIGN KEY (OrderID) REFERENCES Order_mys,
FOREIGN KEY (ProductID) REFERENCES Product_mys
) ;
DESCRIBE Dept_mys ;
DESCRIBE Commission_mys ;
DESCRIBE Category_mys ;
DESCRIBE SalesRep_mys ;
DESCRIBE Customer_mys ;
DESCRIBE Order_mys ;
DESCRIBE Product_mys ;
DESCRIBE OrderDetail_mys ;
--Part II
INSERT INTO Dept_mys
VALUES (10, 'Store Sales') ;
INSERT INTO Dept_mys
VALUES (14, 'Corp Sales') ;
INSERT INTO Dept_mys
VALUES (16, 'Web Sales') ;
INSERT INTO Commission_mys
VALUES (A, .1) ;
INSERT INTO Commission_mys
VALUES (B, .08) ;
INSERT INTO Commission_mys
VALUES (Z, 0) ;
INSERT INTO Commission_mys
VALUES (C, .05) ;
INSERT INTO Category_mys
VALUES (1, 'Hand Tools') ;
INSERT INTO Category_mys
VALUES (2, 'power Tools') ;
INSERT INTO Category_mys
VALUES (4, 'Fasteners') ;
INSERT INTO Category_mys
VALUES (6, 'Misc') ;
INSERT INTO Category_mys
VALUES (3, 'Measuring Tools') ;
INSERT INTO Category_mys
VALUES (5, 'Hardware') ;
INSERT INTO SalesRep_mys
VALUES (10, 'Alice', 'Jones', 10, A) ;
INSERT INTO SalesRep_mys
VALUES (12, 'Greg', 'Taylor', 14, B) ;
INSERT INTO SalesRep_mys
VALUES (14, 'Sara', 'Day', 10, Z) ;
INSERT INTO SalesRep_mys
VALUES (8, 'Kay', 'Price', 14, C) ;
INSERT INTO SalesRep_mys
VALUES (20, 'Bob', 'Jackson', 10, B) ;
INSERT INTO SalesRep_mys
VALUES (22, 'Micah', 'Moore', 16, Z) ;
INSERT INTO Customer_mys
VALUES (S100, 'John', 'Smith', '5551212', 10) ;
INSERT INTO Customer_mys
VALUES (A120, 'Jane', 'Adams', '817555', 14) ;
INSERT INTO Customer_mys
VALUES (J090, 'Tim', 'Jones', NULL, 10) ;
INSERT INTO Customer_mys
VALUES (B200, 'Ann', 'Brown', '972555', 14) ;
INSERT INTO Customer_mys
VALUES (G070, 'Kate', 'Green', NULL, 10) ;
INSERT INTO Customer_mys
VALUES (S120, 'Nicole', 'Sims', NULL, 16) ;
INSERT INTO Order_mys
VALUES (100, '24-Jan-15', S100) ;
INSERT INTO Order_mys
VALUES (101, '25-Jan-15', A120) ;
INSERT INTO Order_mys
VALUES (102, '26-Jan-15', J090) ;
INSERT INTO Order_mys
VALUES (105, '26-Jan-15', B200) ;
INSERT INTO Order_mys
VALUES (106, '27-Jan-15', G070) ;
INSERT INTO Order_mys
VALUES (108, '27-Jan-15', S120) ;
INSERT INTO Product_mys
VALUES (121, 'BD Hammer', 1) ;
INSERT INTO Product_mys
VALUES (228, 'Makita Power Drill', 2) ;
INSERT INTO Product_mys
VALUES (480, '1 # BD Nails', 4) ;
INSERT INTO Product_mys
VALUES (610, '3M Duct Tape', 6) ;
INSERT INTO Product_mys
VALUES (618, '3M Masking Tape', 6) ;
INSERT INTO Product_mys
VALUES (380, 'Acme Yard Stick', 3) ;
INSERT INTO Product_mys
VALUES (535, 'Schlage Door Knob', 5) ;
INSERT INTO Product_mys
VALUES (123, 'Acme Pry Bar', 1) ;
INSERT INTO Product_mys
VALUES (229, 'BD Power Drill', 2) ;
INSERT INTO Product_mys
VALUES (124, 'Acme Hammer', 1) ;
INSERT INTO Product_mys
VALUES (235, 'Makita Power Drill', 2) ;
INSERT INTO OrderDetail_mys
VALUES (100, 121, 2, 8.00) ;
INSERT INTO OrderDetail_mys
VALUES (100, 228, 2, 65.00) ;
INSERT INTO OrderDetail_mys
VALUES (100, 480, 2, 3.00) ;
INSERT INTO OrderDetail_mys
VALUES (100, 407, 1, 4.25) ;
INSERT INTO OrderDetail_mys
VALUES (101, 610, 200, 1.75) ;
INSERT INTO OrderDetail_mys
VALUES (101, 618, 100, 1.25) ;
INSERT INTO OrderDetail_mys
VALUES (101, 121, 2, 8.00) ;
INSERT INTO OrderDetail_mys
VALUES (102, 380, 2, 1.25) ;
INSERT INTO OrderDetail_mys
VALUES (102, 121, 1, 7.00) ;
INSERT INTO OrderDetail_mys
VALUES (102, 535, 4, 7.50) ;
INSERT INTO OrderDetail_mys
VALUES (103, 121, 50, 7.00) ;
INSERT INTO OrderDetail_mys
VALUES (103, 123, 20, 6.25) ;
INSERT INTO OrderDetail_mys
VALUES (101, 121, 2, 8.00) ;
INSERT INTO OrderDetail_mys
VALUES (104, 229, 1, 50.00) ;
INSERT INTO OrderDetail_mys
VALUES (104, 610, 200, 1.75) ;
INSERT INTO OrderDetail_mys
VALUES (104, 380, 2, 1.25) ;
INSERT INTO OrderDetail_mys
VALUES (104, 535, 4, 7.50) ;
INSERT INTO OrderDetail_mys
VALUES (101, 121, 2, 8.00) ;
INSERT INTO OrderDetail_mys
VALUES (105, 610, 200, 1.75) ;
INSERT INTO OrderDetail_mys
VALUES (105, 123, 40, 5.00) ;
INSERT INTO OrderDetail_mys
VALUES (106, 124, 1, 6.50) ;
INSERT INTO OrderDetail_mys
VALUES (107, 229, 1, 59.00) ;
INSERT INTO OrderDetail_mys
VALUES (108, 235, 1, 65.00) ;
COMMIT ;
SELECT * FROM Dept_mys ;
SELECT * FROM Commission_mys ;
SELECT * FROM SalesRep_mys ;
SELECT * FROM Customer_mys ;
SELECT * FROM Category_mys ;
SELECT * FROM Order_mys ;
SELECT * FROM Product_mys ;
SELECT * FROM OrderDetail_mys ;
--PART III
UPDATE Customer_mys
SET CustLName = 'Thompson'
WHERE CustID = 'A120' ;
UPDATE Customer_mys
SET CustPhone = '2146881234'
WHERE CustID = 'J090' ;
UPDATE Product_mys
SET ProductPrice = 7.50
WHERE ProductID = '121' ;
UPDATE OrderDetail_mys
SET ProductName = 'BD Claw Hammer' ;
INSERT INTO Product_mys
VALUES (122, 'BD Rubber Mallet', 1) ;
INSERT INTO Product_mys
VALUES (125, 'Stanley Chisel', 1) ;
INSERT INTO Product_mys
VALUES (126, 'BD Chisel', 1) ;
INSERT INTO Product_mys
VALUES (381, 'BD Measuring Tape', 3) ;
INSERT INTO Product_mys
VALUES (382, 'Stanley Meausring Tape', 3) ;
INSERT INTO Commission_mys
VALUES (D, .03) ;
INSERT INTO SalesRep_mys
VALUES (21, 'Mark', 'Anderson', 14, C) ;
INSERT INTO SalesRep_mys
VALUES (23, 'Jennie', 'Hayes', 10, D) ;
INSERT INTO OrderDetail_mys
VALUES (109, 228, 1, 62.50) ;
INSERT INTO OrderDetail_mys
VALUES (109, 407, 1, 4.00) ;
INSERT INTO OrderDetail_mys
VALUES (109, 381, 2, 7.75) ;
INSERT INTO OrderDetail_mys
VALUES (110, 122, 2, 7.00) ;
INSERT INTO OrderDetail_mys
VALUES (110, 124, 1, 6.75) ;
INSERT INTO OrderDetail_mys
VALUES (110, 480, 2, 3.25) ;
COMMIT ;
SELECT * FROM Dept_mys ;
SELECT * FROM Commission_mys ;
SELECT * FROM SalesRep_mys ;
SELECT * FROM Customer_mys ;
SELECT * FROM Category_mys ;
SELECT * FROM Order_mys ;
SELECT * FROM Product_mys ;
SELECT * FROM OrderDetail_mys ;
I believe you're getting this error because A and B are being interpreted as some kind of variable. Try modifying your query to
INSERT INTO SalesRep_mys
VALUES (10, 'Alice', 'Jones', 10, 'A') ;
INSERT INTO SalesRep_mys
VALUES (12, 'Greg', 'Taylor', 14, 'B') ;
Display the publisher id and name of the publishers who supply both books with a topic id of MySQL and books with a topic id of DB. The books must have a publication year of 2005 or later. These do not have to be the same book. Display only one row per publisher who meets the test.
My Solution:
select DISTINCT publ_id, publ_name
from a_bkinfo.publishers
join a_bkinfo.books using (publ_id)
join a_bkinfo.book_topics using (book_id)
join a_bkorders.order_details using (book_id)
join a_bkorders.order_headers USING (order_id)
where book_id in (
Select book_id
From a_bkinfo.book_topics
Where topic_id = 'SQL'
)
And book_id in (
Select book_id
From a_bkinfo.book_topics
Where topic_id = 'DB'
)
And book_id in
Select book_id
From a_bkinfo.book_topics
Where year(order_date) > 2005
);
Here are the tables:
-- create publishers
create table a_bkinfo.publishers (
publ_id integer not null
, publ_name varchar(25) not null
, constraint bk_publishers_pk primary key(publ_id)
, constraint publ_id_range check (publ_id >1000)
)engine = INNODB;
-- create books
create table a_bkinfo.books (
book_id integer not null
, title varchar(75) not null
, publ_id integer null
, year_publd integer not null
, isbn varchar(17) null
, page_count integer null
, list_price numeric(6,2) null
, constraint bk_books_pk primary key (book_id)
, constraint bk_books_publ_fk foreign key(publ_id)
references a_bkinfo.publishers (publ_id)
, constraint book_id_range check (book_id > 1000)
, constraint bk_page_count_ck check (page_count >= 0)
, constraint bk_price_ck check (list_price >= 0)
, constraint bk_books_year_ck check (year_publd >= 1850)
)engine = INNODB;
-- create book_topics
create table a_bkinfo.book_topics (
book_id integer not null
, topic_id varchar(5) not null
, constraint bk_book_topics_pk primary key (book_id, topic_id)
, constraint bk_books_topics_fk foreign key(topic_id)
references a_bkinfo.topics(topic_id)
, constraint bk_books_id_fk foreign key(book_id)
references a_bkinfo.books(book_id)
)engine = INNODB;
-- create order_headers
create table a_bkorders.order_headers (
order_id integer not null
, order_date date not null
, cust_id integer not null
, constraint bk_orders_pk primary key (order_id)
, constraint bk_orders_cust_fk foreign key(cust_id)
references a_bkorders.customers(cust_id)
, constraint bk_order_id_range check (order_id > 100)
, constraint bk_order_date_ck check (order_date >= '2000-01-01')
)engine = INNODB;
-- create order_details
create table a_bkorders.order_details (
order_id integer not null
, order_line integer not null
, book_id integer not null
, quantity integer not null
, order_price numeric(6,2) not null
, constraint bk_orderline_pk primary key (order_id, order_line)
, constraint bk_orderline_order_fk foreign key (order_id)
references a_bkorders.order_headers(order_id) on delete cascade
, constraint bk_orderline_book_fk foreign key (book_id )
references a_bkinfo.books(book_id)
, constraint bk_quantity_ck check (quantity > 0)
, constraint bk_ordprice_ck check (order_price >= 0)
)engine = INNODB;
Here are some inserts:
-- publishers
Insert into a_bkinfo.publishers values (9000, 'Microsoft Press') ;
Insert into a_bkinfo.publishers values (9456, 'New Directions') ;
Insert into a_bkinfo.publishers values (9102, 'Alfred A. Knopf') ;
Insert into a_bkinfo.publishers values (9325, 'Addison Wesley') ;
Insert into a_bkinfo.publishers values (9745, 'Morgan Kaufmann') ;
Insert into a_bkinfo.publishers values (9521, 'Benjamin/Cummings') ;
Insert into a_bkinfo.publishers values (9822, 'O''Reilly') ;
Insert into a_bkinfo.publishers values (9030, 'McGraw Hill') ;
Insert into a_bkinfo.publishers values (9444, 'APress') ;
Insert into a_bkinfo.publishers values (9528, 'Manning');
Insert into a_bkinfo.publishers values (9020, 'Princeton Univer Press') ;
Insert into a_bkinfo.publishers values (9021, 'Yale University Press') ;
Insert into a_bkinfo.publishers values (9022, 'Havard University Press') ;
Insert into a_bkinfo.publishers values (9507, 'J.Q. Vanderbildt');
Insert into a_bkinfo.publishers values (9664, 'WROX') ;
Insert into a_bkinfo.publishers values (9825, 'MySQL Press') ;
Insert into a_bkinfo.publishers values (9623, 'Prentice Hall') ;
Insert into a_bkinfo.publishers values (9725, 'Springer') ;
Insert into a_bkinfo.publishers values (9561, 'Houghton Mifflin');
Insert into a_bkinfo.publishers values (9902, 'W.W. Norton ') ;
Insert into a_bkinfo.publishers values (9023, 'Holt Paperbacks') ;
Insert into a_bkinfo.publishers values (9024, 'Univ of California Press') ;
Insert into a_bkinfo.publishers values (9776, 'Simon and Schuster') ;
-- topics
Insert into a_bkinfo.topics values ('ADO', 'ADO');
Insert into a_bkinfo.topics values ('CMP', 'Computer Science');
Insert into a_bkinfo.topics values ('DB', 'Database Systems');
Insert into a_bkinfo.topics values ('FCT', 'Fiction');
Insert into a_bkinfo.topics values ('HIST', 'History');
Insert into a_bkinfo.topics values ('MySQL', 'MySQL Database');
Insert into a_bkinfo.topics values ('NET', '.NET Technologies');
Insert into a_bkinfo.topics values ('NOSQL', 'Alternate Data Storage');
Insert into a_bkinfo.topics values ('ORA', 'Oracle Database');
Insert into a_bkinfo.topics values ('POE', 'Poetry');
Insert into a_bkinfo.topics values ('PGM', 'General Programming');
Insert into a_bkinfo.topics values ('SCI', 'Science');
Insert into a_bkinfo.topics values ('SQL', 'SQL');
Insert into a_bkinfo.topics values ('SSRV', 'SQL Server Database');
Insert into a_bkinfo.topics values ('VB', 'Visual Basic');
Insert into a_bkinfo.topics values ('XML', 'XML Techniques');
Insert into a_bkinfo.topics values ('ART', 'Arts, Photography');
-- books
insert into a_bkinfo.books values (1101, 'Programming SQL Server with VB.NET', 9000, 2002, '0735615357', 300, 59.99);
insert into a_bkinfo.books values (1102, 'Practical Standards for VB.NET', 9000, 2003, '0735613568', 250, 49.99);
insert into a_bkinfo.books values (1103, 'Selected Poems', 9456, 1949, null, 125, 12.00);
insert into a_bkinfo.books values (1104, 'Sibley Guide to Bird Life and Behavior', 9102, 2001, '0679451234', 604, 45.00);
insert into a_bkinfo.books values (1105, 'SQL:1999 Relational Language Concepts', 9745, 2002, '1558604561', 450, 59.95);
insert into a_bkinfo.books values (1106, 'SQL for Smarties', 9745, 1995, '1558603239', 250, 29.00);
insert into a_bkinfo.books values (1107, 'SQL Puzzles and Answers', 9745, 1997, '1558604537', 325, 25.00);
insert into a_bkinfo.books values (1108, 'Database Systems', 9325, 1996, null, 680, 39.95);
insert into a_bkinfo.books values (1109, 'Intro to DB Systems-7th Ed', 9325, 2000, '0201385902', 650, 80.00);
insert into a_bkinfo.books values (1110, 'Adv SQL:1999 Object_Relational Features', 9745, 2002, '1558606077', 520, 59.95);
insert into a_bkinfo.books values (1128, 'Temporal Data and the Relational Model', 9325, 2003, 'na', 275, 49.95);
insert into a_bkinfo.books values (1133, 'Leaves of Grass', 9623, 1902, null, 125, 19.95);
insert into a_bkinfo.books values (1142, 'Relational Database Theory', 9521, 1993, null, 879, 95.00);
insert into a_bkinfo.books values (1161, 'SQL Programming Style', 9745, 2005, '0120887975', 780, 35.00);
insert into a_bkinfo.books values (1162, 'Trees and Hierarchies', 9745, 2004, '1558609202', 350, 35.00);
insert into a_bkinfo.books values (1180, 'MySQL Database Design and Tuning', 9825, 2005, '9780672234650', 400, 49.99);
insert into a_bkinfo.books values (1175, 'MySQL in a Nutshell', 9822, 2008, '9780596514331', 538, 34.99);
insert into a_bkinfo.books values (1182, 'MySQL Cookbook', 9822, 2007, '9780596527082', 918, 49.99);
insert into a_bkinfo.books values (1185, 'MySQL Stored Procedures', 9822, 2007, '9780596100896', 595, 49.99);
insert into a_bkinfo.books values (1184, 'MySQL Developer''s Library', 9325, 2009, '9780672329388', 650, 49.99);
insert into a_bkinfo.books values (1301, 'ADO and Oracle Workbook', 9000, 2002, '0265615357', 0, 59.99);
insert into a_bkinfo.books values (1302, 'ADO: the ebook', 9000, 2002, '0852515358', null, 49.99);
insert into a_bkinfo.books values (1303, 'Rainbows and Rainbows', 9521, 2002, '0657895157', null, 59.99);
insert into a_bkinfo.books values (1304, 'Stories of Discoveries', 9325, 2002, '0777788887', 300, 59.99);
insert into a_bkinfo.books values (1305, 'Journeys Through Flatland', 9325, 1958, '0387515357', 100, 9.99);
insert into a_bkinfo.books values (1306, 'Myths of SQL',
9664, 2000, '0454615027', 2895,259.99);
Insert into a_bkorders.order_headers values(30822, '2012-03-12', 211483);
Insert into a_bkorders.order_details values(30822, 1, 1128, 10, 49.95);
/* Apr 2012 */
Insert into a_bkorders.order_headers values(30824, '2012-04-05', 222477);
Insert into a_bkorders.order_details values(30824, 1, 1670, 10, 40.00);
Insert into a_bkorders.order_details values(30824, 4, 2005, 20, 45.00);
Insert into a_bkorders.order_headers values(2001, '2012-04-02', 272787);
Insert into a_bkorders.order_details values(2001, 1, 1448, 50, 25.00);
Insert into a_bkorders.order_headers values(2002, '2012-04-12', 272787);
Insert into a_bkorders.order_details values(2002, 1, 1103, 20, 10.95);
Insert into a_bkorders.order_headers values(2003, '2012-04-12', 272787);
Insert into a_bkorders.order_details values(2003, 1, 1103, 2, 12.00);
Insert into a_bkorders.order_headers values(1564, '2012-04-18', 227105);
Insert into a_bkorders.order_details values(1564, 1, 1106, 50, 34.95);
Insert into a_bkorders.order_details values(1564, 2, 1107, 50, 20.95);
Insert into a_bkorders.order_details values(1564, 3, 2001, 50, 39.00);
Insert into a_bkorders.order_headers values(1800, '2012-04-12', 217796);
Insert into a_bkorders.order_details values(1800, 1, 2009, 5, 34.95);
Insert into a_bkorders.order_details values(1800, 2, 2008, 1, 46.95);
Insert into a_bkorders.order_headers values(1801, '2012-04-13', 217796);
Insert into a_bkorders.order_details values(1801, 1, 1103, 2, 10.95);
Insert into a_bkorders.order_details values(1801, 2, 1106, 1, 29.00);
Insert into a_bkorders.order_headers values(30825, '2012-04-21', 221297);
Insert into a_bkorders.order_details values(30825, 1, 1776, 4, 45.49);
Insert into a_bkorders.order_headers values(30826, '2012-04-24', 211483);
Insert into a_bkorders.order_details values(30826, 2, 1161, 16, 35.00);
Insert into a_bkorders.order_headers values(30833, '2012-04-14', 211483);
Insert into a_bkorders.order_details values(30833, 1, 1448, 50, 25.00);
Insert into a_bkorders.order_headers values(30834, '2012-04-17', 211483);
Insert into a_bkorders.order_details values(30834, 1, 1128, 1, 49.95);
/* May 2012 */
Insert into a_bkorders.order_headers values(30835, '2012-05-17', 211483);
Insert into a_bkorders.order_details values(30835, 1, 1103, 25, 10.95);
Insert into a_bkorders.order_headers values(30836, '2012-05-20', 258595);
Insert into a_bkorders.order_details values(30836, 1, 2008, 2, 12.50);
Insert into a_bkorders.order_headers values(1811, '2012-05-12', 221297);
Insert into a_bkorders.order_details values(1811, 1, 2007, 1, 40.49);
Insert into a_bkorders.order_details values(1811, 2, 1357, 2, 23.40);
Insert into a_bkorders.order_details values(1811, 3, 1537, 3, 28.19);
Insert into a_bkorders.order_headers values(1812, '2012-05-12', 227105);
Insert into a_bkorders.order_details values(1812, 1, 2009, 1, 26.99);
Insert into a_bkorders.order_headers values(1814, '2012-05-15', 290298);
Insert into a_bkorders.order_details values(1814, 1, 1258, 1, 45.99);
Insert into a_bkorders.order_headers values(1818, '2012-05-16', 212921);
Insert into a_bkorders.order_details values(1818, 1, 1106, 30, 20.00);
Insert into a_bkorders.order_details values(1818, 2, 1537, 2, 25.00);
Insert into a_bkorders.order_details values(1818, 3, 1180, 1, 46.99);
Insert into a_bkorders.order_details values(1818, 4, 1979, 1, 53.99);
Insert into a_bkorders.order_headers values(1710, '2012-05-08', 261502);
Insert into a_bkorders.order_details values(1710, 1, 1776, 99, 45.49);
Insert into a_bkorders.order_headers values(1712, '2012-05-09', 290298);
Insert into a_bkorders.order_details values(1712, 1, 1835, 1, 45.99);
Insert into a_bkorders.order_details values(1712, 2, 1162, 99, 30.00);
Insert into a_bkorders.order_headers values(2004, '2012-05-22', 272787);
Insert into a_bkorders.order_details values(2004, 2, 1161, 1, 35.00);
Insert into a_bkorders.order_headers values(2005, '2012-05-30', 272787);
Insert into a_bkorders.order_details values(2005, 1, 1448, 50, 25.00);
/* June 2012 */
Insert into a_bkorders.order_headers values(2012, '2012-06-22', 272787);
Insert into a_bkorders.order_details values(2012, 1, 1448, 50, 25.00);
Insert into a_bkorders.order_headers values(2013, '2012-06-22', 272787);
Insert into a_bkorders.order_details values(2013, 1, 2009, 2, 12.50);
Insert into a_bkorders.order_headers values(30847, '2012-06-20', 296598);
Insert into a_bkorders.order_details values(30847, 1, 1103, 2, 12.00);
Insert into a_bkorders.order_headers values(30848, '2012-06-21', 263119);
Insert into a_bkorders.order_details values(30848, 1, 2007, 2, 12.50);
Insert into a_bkorders.order_headers values(30849, '2012-06-22', 217796);
Insert into a_bkorders.order_details values(30849, 1, 1448, 50, 25.00);
/* July 2012 */
Insert into a_bkorders.order_headers values(31840, '2012-07-01', 267780);
Insert into a_bkorders.order_details values(31840, 1, 1103, 2, 12.00);
Insert into a_bkorders.order_headers values(31841, '2012-07-02', 272787);
Insert into a_bkorders.order_details values(31841, 1, 1448, 50, 25.00);
Insert into a_bkorders.order_headers values(31850, '2012-07-02', 234138);
Insert into a_bkorders.order_details values(31850, 1, 1279, 1, 40.49);
Insert into a_bkorders.order_headers values(1045, '2012-07-18', 222477);
Insert into a_bkorders.order_details values(1045, 1, 1894, 1, 35.99);
Insert into a_bkorders.order_headers values(1200, '2012-07-18', 212921);
Insert into a_bkorders.order_details values(1200, 1, 1200, 5, 16.33);
Insert into a_bkorders.order_details values(1200, 2, 1199, 5, 18.39);
Insert into a_bkorders.order_details values(1200, 3, 1457, 5, 53.99);
Insert into a_bkorders.order_details values(1200, 4, 1133, 5, 18.15);
Insert into a_bkorders.order_details values(1200, 5, 1894, 5, 36.79);
Insert into a_bkorders.order_details values(1200, 6, 1948, 5, 40.94);
Insert into a_bkorders.order_details values(1200, 7, 1180, 5, 45.99);
Insert into a_bkorders.order_details values(1200, 8, 1128, 5, 46.20);
Insert into a_bkorders.order_headers values(1205, '2012-07-20', 212921);
Insert into a_bkorders.order_details values(1205, 1, 1448, 1, 27.29);
Insert into a_bkorders.order_headers values(1212, '2012-07-20', 290298);
Insert into a_bkorders.order_details values(1212, 1, 1894, 1, 37.59);
Insert into a_bkorders.order_details values(1212, 2, 1894, 1, 18.75);
First, a warning. I think this is the first MySQL query I have ever written! So I may not have the syntax right. The way you are joining is strange to me. In my experience, the join is a little more explicit as to what is joined to what and on what fields. I'm also unsure of including publ_name and order_date in the SELECT clause but not in the GROUP BY. Would this produce multiple results per publisher regardless of the GROUP BY clause?
Saharsh's approach is better, but an alternative might look something like this:
SELECT
p.publ_id,
max(p.publ_name) as publ_name,
max(oh.order_date) as order_date
FROM
a_bkinfo.publishers p INNER JOIN a_bkinfo.books b
ON p.publ_id = b.publ_id
INNER JOIN a_bkinfo.book_topics bt
ON b.book_id = bt.book_id
INNER JOIN a_bkinfo.book_topics bt2
ON b.book_id = bt2.book_id
INNER JOIN a_bkorders.order_details od
ON b.book_id = od.book_id
INNER JOIN a_bkorders.order_headers oh
ON od.order_id = oh.order_id
WHERE
bt.topic_id = 'SQL' AND
bt2.topic_id = 'DB' AND
YEAR(oh.order_date) >= 2005
GROUP BY
p.publ_id
Try this:
SELECT p.publ_id, p.publ_name, oh.order_date
FROM a_bkinfo.publishers p
JOIN a_bkinfo.books b USING (publ_id)
JOIN a_bkinfo.book_topics bt USING (book_id)
JOIN a_bkorders.order_details od USING (book_id)
JOIN a_bkorders.order_headers oh USING (order_id)
WHERE bt.topic_id IN ('SQL', 'DB') AND YEAR(oh.order_date) >= 2005
GROUP BY p.publ_id HAVING COUNT(DISTINCT bt.topic_id) = 2;
I have a MySQL DB that needs to provide attributes associated with a taxonomy. I desire to have a list of all attributes, including "inherited attributes" for a given element in the taxonomy. I'm not an SQL expert & have learned (and plagiarized) much from this site. One thing I learned here is to use a Closure Table to represent my Hierarchy. What I need to do for my database is associate a large number of attributes to elements within hierarchy. However, I can't seem to figure out how to grab all of the attributes associated with a given node and all of its parents. I created the following example database for the purpose of this question (feel free to comment on anything about this schema, the fake data is just noise).
My example MySQL database structure looks like this:
-- Simple Sample
SET FOREIGN_KEY_CHECKS=0;
DROP TRIGGER IF EXISTS inheritance_tree_insert;
DROP TRIGGER IF EXISTS inheritance_tree_update;
DROP TABLE IF EXISTS inheritance_paths;
DROP TABLE IF EXISTS inheritance_tree;
DROP TABLE IF EXISTS attributes;
SET FOREIGN_KEY_CHECKS=1;
CREATE TABLE `inheritance_tree` (
`it_id` INT NOT NULL, -- PK
`parent` INT, -- Parent id & FK
`child_order` INT, -- Oder of siblings
`name` VARCHAR(500) NOT NULL, -- Name for the entry
PRIMARY KEY (`it_id`),
FOREIGN KEY (`parent`) REFERENCES inheritance_tree(`it_id`) ON DELETE CASCADE,
INDEX(`name`)
) ENGINE = INNODB;
-- Trigger to update the paths table for new entries
DELIMITER //
CREATE TRIGGER `inheritance_tree_insert` AFTER INSERT ON `inheritance_tree` FOR EACH ROW
BEGIN
INSERT INTO `inheritance_paths` (`ancestor`, `descendant`, `len`)
SELECT `ancestor`, NEW.`it_id`, len + 1 FROM `inheritance_paths`
WHERE `descendant` = NEW.`parent`
UNION ALL SELECT NEW.`it_id`, NEW.`it_id`, 0;
END; //
DELIMITER ;
DELIMITER //
CREATE TRIGGER `inheritance_tree_update` BEFORE UPDATE ON `inheritance_tree` FOR EACH ROW
BEGIN
-- From http://www.mysqlperformanceblog.com/2011/02/14/moving-subtrees-in-closure-table/
IF OLD.`parent` != NEW.`parent` THEN
-- Remove the node from its current parent
DELETE a FROM `inheritance_paths` AS a
JOIN `inheritance_paths` AS d ON a.`descendant` = d.`descendant`
LEFT JOIN `inheritance_paths` AS x
ON x.`ancestor` = d.`ancestor` AND x.`descendant` = a.`ancestor`
WHERE d.`ancestor` = OLD.`it_id` AND x.`ancestor` IS NULL;
-- Add the node to its new parent
INSERT `inheritance_paths` (`ancestor`, `descendant`, `len`)
SELECT supertree.`ancestor`, subtree.`descendant`, supertree.`len`+subtree.`len`+1
FROM `inheritance_paths` AS supertree JOIN `inheritance_paths` AS subtree
WHERE subtree.`ancestor` = OLD.`it_id`
AND supertree.`descendant` = NEW.`parent`;
END IF;
END; //
DELIMITER ;
CREATE TABLE `inheritance_paths` (
`ancestor` INT NOT NULL,
`descendant` INT NOT NULL,
`len` INT NOT NULL,
PRIMARY KEY (`ancestor`, `descendant`),
FOREIGN KEY (`ancestor`) REFERENCES inheritance_tree(`it_id`) ON DELETE CASCADE,
FOREIGN KEY (`descendant`) REFERENCES inheritance_tree(`it_id`) ON DELETE CASCADE
) ENGINE = INNODB;
INSERT INTO `inheritance_tree` VALUES(1, NULL, NULL, 'Animal');
INSERT INTO `inheritance_tree` VALUES(2, 1, 1, 'Mammal');
INSERT INTO `inheritance_tree` VALUES(3, 1, 2, 'Bird');
INSERT INTO `inheritance_tree` VALUES(4, 1, 3, 'Reptile');
INSERT INTO `inheritance_tree` VALUES(5, 2, 2, 'Feline');
INSERT INTO `inheritance_tree` VALUES(6, 2, 1, 'Bovine');
INSERT INTO `inheritance_tree` VALUES(7, 1, 3, 'Fish');
INSERT INTO `inheritance_tree` VALUES(8, 4, 1, 'Snake');
INSERT INTO `inheritance_tree` VALUES(9, 4, 2, 'Lizard');
INSERT INTO `inheritance_tree` VALUES(10, NULL, NULL, 'Machine');
INSERT INTO `inheritance_tree` VALUES(11, 10, 1, 'Automobile');
INSERT INTO `inheritance_tree` VALUES(12, 10, 2, 'OfficeMachine');
INSERT INTO `inheritance_tree` VALUES(13, 10, 3, 'Robot');
DELIMITER ;
CREATE TABLE `attributes` (
`a_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'the unique identifier',
`attribute_name` varchar(255) DEFAULT NULL,
`attribute_type` int(11) NOT NULL,
PRIMARY KEY (`a_id`),
KEY `fk_attributes_attribute_type1_idx` (`attribute_type`),
CONSTRAINT `fk_attributes_attribute_type1_idx` FOREIGN KEY (`attribute_type`) REFERENCES `inheritance_tree` (`it_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
INSERT INTO `attributes` VALUES(1, 'IsAlive', 1); -- Animal
INSERT INTO `attributes` VALUES(2, 'HasMaximumLifeSpan', 1); -- Animal
INSERT INTO `attributes` VALUES(3, 'IsNotAlive', 10); -- Machine
INSERT INTO `attributes` VALUES(4, 'HasIndeterminantLifeSpan', 10); -- Machine
INSERT INTO `attributes` VALUES(5, 'BreathesAir', 2); -- Mammal
INSERT INTO `attributes` VALUES(6, 'CanFly', 3); -- Bird
INSERT INTO `attributes` VALUES(7, 'HasFeathers', 3); -- Bird
INSERT INTO `attributes` VALUES(8, 'ColdBlooded', 4); -- Reptile
INSERT INTO `attributes` VALUES(9, 'HasFourLegs', 5); -- Feline
INSERT INTO `attributes` VALUES(10, 'HasFourLegs', 6); -- Bovine
INSERT INTO `attributes` VALUES(11, 'ColdBlooded', 7); -- Fish
INSERT INTO `attributes` VALUES(12, 'HasNoLegs', 8); -- Snake
INSERT INTO `attributes` VALUES(13, 'HasFourLegs', 9); -- Lizard
INSERT INTO `attributes` VALUES(14, 'ConsumesGasoline', 11); -- Automobile
INSERT INTO `attributes` VALUES(15, 'ConsumesElectricity', 12); -- OfficeMachine
INSERT INTO `attributes` VALUES(16, 'ConsumesElectricity', 13); -- Robot
INSERT INTO `attributes` VALUES(17, 'WarmBlooded', 2); -- Mammal
INSERT INTO `attributes` VALUES(18, 'WarmBlooded', 3); -- Bird
INSERT INTO `attributes` VALUES(19, 'BreathesWater', 7); -- Fish
INSERT INTO `attributes` VALUES(20, 'HasScales', 8); -- Snake
INSERT INTO `attributes` VALUES(21, 'HasSkin', 9); -- Lizard
Assumptions:
1.All entities in the taxonomy are uniquely named. This means there is one and only one sub-type called “Fish” anywhere in any of the taxonomy trees.
2.Attributes are not unique and may repeat
GOAL:
Given the input type “Lizard” I would like a single query that returns the following list of attribute records:
1, IsAlive, 1
2, HasMaximumLifeSpan, 1
5, BreathesAir, 2
8, ColdBlooded, 4
13, HasFourLegs, 9
21, HasSkin, 9
SELECT a.*
FROM inheritance_tree t
JOIN inheritance_paths p ON p.descendant = t.it_id
JOIN attributes a ON a.attribute_type = p.ancestor
WHERE t.name = 'Lizard'
See it on sqlfiddle.
Note that your example output includes a_id = 5 (BreathesAir), which is a property of it_id = 2 (Mammal), which is not in the Lizard's ancestry.