SQL Schema Level Constraint - mysql

I've got a constraint between some tables I'm trying to implement, I imagine I should be doing it on the db level, but I'm struggling to come up with the right terms to google, maybe you guys can help!
If I have the tables:
Product [coke, banana, chocolate etc]
ProductType [food, drink, cosmetics etc]
Location [fridge, shelf, cupboard etc]
If -> is many-to-one, and >-< is many-to-many
Product -> ProductType
Product -> Location
ProductType >-< Location
Given a fridge, we know a fridge can contain [food,drink], so on the application level, we present the user with only the food and drink products to allocate to fridge. Is there a way on the db level to ensure that fridge only contains products from its permitted types?
Below is the SQL code I came up with for the above, in the last part I insert 'coke', with ProductType 'drink'. How to I make sure it therefore can't be put in a 'cupboard'
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `test` ;
-- -----------------------------------------------------
-- Table `test`.`Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`Location` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `test`.`ProductType`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`ProductType` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `test`.`Product`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`Product` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`Location_id` INT NULL,
`ProductType_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_Product_Location_idx` (`Location_id` ASC),
INDEX `fk_Product_ProductType1_idx` (`ProductType_id` ASC),
CONSTRAINT `fk_Product_Location`
FOREIGN KEY (`Location_id`)
REFERENCES `test`.`Location` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Product_ProductType1`
FOREIGN KEY (`ProductType_id`)
REFERENCES `test`.`ProductType` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `test`.`ProductType_has_Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`ProductType_has_Location` (
`ProductType_id` INT NOT NULL,
`Location_id` INT NOT NULL,
PRIMARY KEY (`ProductType_id`, `Location_id`),
INDEX `fk_ProductType_has_Location_Location1_idx` (`Location_id` ASC),
INDEX `fk_ProductType_has_Location_ProductType1_idx` (`ProductType_id` ASC),
CONSTRAINT `fk_ProductType_has_Location_ProductType1`
FOREIGN KEY (`ProductType_id`)
REFERENCES `test`.`ProductType` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_ProductType_has_Location_Location1`
FOREIGN KEY (`Location_id`)
REFERENCES `test`.`Location` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
INSERT INTO `test`.`Location`
(`name`)
VALUES
('fridge'),('shelf'),('cupboard');
INSERT INTO `test`.`ProductType`
(`name`)
VALUES
('food'),('drink'),('cosmetics');
INSERT INTO `test`.`ProductType_has_Location`
(`ProductType_id`,`Location_id`)
VALUES
(1,1),(2,1),(2,2),(3,3);
INSERT INTO `test`.`Product`
(`name`,`ProductType_id`,`Location_id`)
VALUES
('coke',2,NULL);

Another constraint in Product:
CONSTRAINT `fk_Product_Location_XRef`
FOREIGN KEY (`ProductType_id`,`Location_id`)
REFERENCES `test`.`ProductType_has_Location` (`ProductType_id`,`Location_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION
This then checks that the Type and Location agree with what's in the ProductType_has_Location table.

Related

Writing trigger in MySQL regarding two tables, with logic

When I write trigger mentioned below I get error "INSERT not expected here"
Tables movies, Lightning is many to many relation with associative table.
My aim is to get Lumens_power in 'Lightning' table set as 5300 when Movies table 'genre' attribute is equal to 'action' .
CREATE DEFINER = CURRENT_USER TRIGGER `Film_industry`.`Movies_AFTER_INSERT`
AFTER INSERT ON `Movies` FOR EACH ROW
BEGIN
SELECT genre,
CASE WHEN genre = 'action' THEN INSERT INTO Lightning(id, type, Lumens_power) values('NEW.Movies_id', 'directed', '5300');
END;
FROM Movies;
END;
-- -----------------------------------------------------
-- Table `Film_industry`.`Movies`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Film_industry`.`Movies` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`released_on` DATE NOT NULL,
`genre` VARCHAR(40) NOT NULL,
`rating` DECIMAL(2,1) NOT NULL,
`finansial_stake` DECIMAL(11,2) NOT NULL,
`Supporting_object_id` INT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
UNIQUE INDEX `title_UNIQUE` (`title` ASC) VISIBLE,
INDEX `fk_Movies_Supporting_object1_idx` (`Supporting_object_id` ASC) VISIBLE,
CONSTRAINT `fk_Movies_Supporting_object1`
FOREIGN KEY (`Supporting_object_id`)
REFERENCES `Film_industry`.`Supporting_object` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Film_industry`.`Lightning`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Film_industry`.`Lightning` (
`id` INT NOT NULL AUTO_INCREMENT,
`type` VARCHAR(45) NOT NULL,
`Lumens_power` INT NOT NULL,
`Scene_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_Lightning_Scene1_idx` (`Scene_id` ASC) VISIBLE,
CONSTRAINT `fk_Lightning_Scene1`
FOREIGN KEY (`Scene_id`)
REFERENCES `Film_industry`.`Scene` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
You can check the value for the genre column simply using
IF (NEW.genre = 'action') then
INSERT...
END;
Note that the Lightning-table also contains Scene_id which references the Film_industry.Scene.id. It is defined as NOT NULL, so you need to come up with the logic to set it appropriately.

Error 1136: Column count doesn't match value count at row 1. Can't find unmatching columns

I keep getting this error when I try to build this little database:
ERROR: Error 1136: Column count doesn't match value count at row 1
SQL Code:
INSERT INTO area (name, description)
VALUES ('National'),
('The place for all National political issues.')
SQL script execution finished: statements: 19 succeeded, 1 failed
It seems like all of my column counts match so I have no idea where I'm going wrong. I think the problem is happening with my inserts. I'm using MySQLWorkbench and the problem happens each time I try to build the database from scratch. Any help would be appreciated!
Thank you.
-- MySQL Workbench Forward Engineering
SET #OLD_UNIQUE_CHECKS=##UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET #OLD_FOREIGN_KEY_CHECKS=##FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET #OLD_SQL_MODE=##SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema RvB
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema RvB
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `RvB` DEFAULT CHARACTER SET utf8 ;
USE `RvB` ;
-- -----------------------------------------------------
-- Table `RvB`.`area`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`area` (
`name` VARCHAR(100) NOT NULL,
`description` VARCHAR(200) NULL,
PRIMARY KEY (`name`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`links`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`links` (
`id` INT NOT NULL AUTO_INCREMENT,
`link` VARCHAR(999) NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`affiliation`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`affiliation` (
`id` INT NOT NULL AUTO_INCREMENT,
`affiliation` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`privilege`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`privilege` (
`id` INT NOT NULL AUTO_INCREMENT,
`privilege` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`pages`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`pages` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NOT NULL,
`area` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`),
INDEX `area_idx` (`area` ASC) VISIBLE,
CONSTRAINT `area`
FOREIGN KEY (`area`)
REFERENCES `RvB`.`area` (`name`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`accounts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`accounts` (
`username` VARCHAR(20) NOT NULL,
`email` VARCHAR(100) NOT NULL,
`party` INT NOT NULL,
`password` VARCHAR(40) NOT NULL,
`creation_date` DATE NULL,
`privileges` INT NOT NULL,
PRIMARY KEY (`username`),
INDEX `party_idx` (`party` ASC) VISIBLE,
INDEX `privileges_idx` (`privileges` ASC) VISIBLE,
CONSTRAINT `party`
FOREIGN KEY (`party`)
REFERENCES `RvB`.`affiliation` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `privileges`
FOREIGN KEY (`privileges`)
REFERENCES `RvB`.`privilege` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`posts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`posts` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(20) NOT NULL,
`affiliation` INT NOT NULL,
`post_text` VARCHAR(9999) NULL,
`time_and_date` DATETIME(4) NOT NULL,
`votes` INT NOT NULL DEFAULT 0,
`page` INT NOT NULL,
`post_title` VARCHAR(500) NOT NULL,
PRIMARY KEY (`id`),
INDEX `page_idx` (`page` ASC) VISIBLE,
INDEX `affiliation_idx` (`affiliation` ASC) VISIBLE,
INDEX `username_idx` (`username` ASC) VISIBLE,
CONSTRAINT `page`
FOREIGN KEY (`page`)
REFERENCES `RvB`.`pages` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `affiliation`
FOREIGN KEY (`affiliation`)
REFERENCES `RvB`.`affiliation` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `username`
FOREIGN KEY (`username`)
REFERENCES `RvB`.`accounts` (`username`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`postComments`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`postComments` (
`id` INT NOT NULL AUTO_INCREMENT,
`post_id` INT NOT NULL,
`username` VARCHAR(20) NOT NULL,
`text` VARCHAR(8000) NULL,
`date` DATETIME NULL,
PRIMARY KEY (`id`),
INDEX `post_id_idx` (`post_id` ASC) VISIBLE,
INDEX `username_idx` (`username` ASC) VISIBLE,
CONSTRAINT `postid`
FOREIGN KEY (`post_id`)
REFERENCES `RvB`.`posts` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `user-name`
FOREIGN KEY (`username`)
REFERENCES `RvB`.`accounts` (`username`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `RvB`.`contactUs`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RvB`.`contactUs` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(150) NOT NULL,
`message` VARCHAR(2000) NULL,
`name` VARCHAR(150) NULL,
`date` DATETIME NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
SET SQL_MODE=#OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=#OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=#OLD_UNIQUE_CHECKS;
-- begin attached script 'script'
INSERT INTO privilege (privilege)
VALUES ('reg_user'),
('moderator'),
('archmoderator'),
('admin');
INSERT INTO affiliation (affiliation)
VALUES ('republican'),
('democrat'),
('libertarian'),
('green'),
('constitution');
INSERT INTO area (name, description)
VALUES ('National'),
('The place for all National political issues.');
INSERT INTO area (name, description)
VALUES ('Colorado'),
('The place for all Colorado issues or politicians.');
INSERT INTO pages (title, area)
VALUES ('Abortion'),
('National');
INSERT INTO accounts (username, email, party, password, creation_date, privileges)
VALUES ('dan_the_repub'),
('republican#gmail.com'),
('1'),
('password'),
('2020-09-14'),
('1');
INSERT INTO accounts (username, email, party, password, creation_date, privileges)
VALUES ('kendra_the_demo'),
('democratsRus#gmail.com'),
('2'),
('password'),
('2020-09-13'),
('1');
INSERT INTO posts (username, affiliation, post_text, time_and_date, votes, page, post_title)
VALUES ('dan_the_repub'),
('1'),
('Republicans rule!!'),
('2020-09-15 12:43:10'),
('20'),
('1'),
('What I think about Republicans, a statement');
INSERT INTO posts (username, affiliation, post_text, time_and_date, votes, page, post_title)
VALUES ('kendra_the_demo'),
('2'),
('Go go go go Democrats!!'),
('2020-09-13 11:42:05'),
('25'),
('1'),
('Democrats are the best! Everyone else stinks!');
-- end attached script 'script'
Each parenthesized group after VALUES is a single row, with an expression for each column in it. If you want to insert 1 row with 2 columns, you should just have a single group.
VALUES ('National', 'The place for all National political issues.')
Your code is trying to insert 2 rows, but it's only supplying a value for 1 column in each row. The number of expressions in each group has to match the number of columns in the list after INSERT INTO area.

Find a data throughout out other data mysql

I've literally no idea how to find the "via" field from 'sede' table starting from the "cognome" field in 'impiegato' table.
CREATE TABLE IF NOT EXISTS `mydb`.`impiegato` (
`codice` VARCHAR(45) NOT NULL,
`cognome` VARCHAR(45),
`nomedipart` VARCHAR(45),
`sede` VARCHAR(45),
`data` VARCHAR(45),
PRIMARY KEY (`codice`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`sede`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`sede` (
`cittaSede` VARCHAR(45) NOT NULL,
`via` VARCHAR(45) NULL,
`cap` VARCHAR(45) NULL,
PRIMARY KEY (`cittaSede`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`dipartimento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`dipartimento` (
`nome` VARCHAR(45) NOT NULL,
`cittaSede` VARCHAR(45) NOT NULL,
`Telefono` VARCHAR(45),
`codDirett` VARCHAR(45),
INDEX `fk_dipartimento_idx` (`codDirett` ASC),
PRIMARY KEY (`nome`),
INDEX `fk_sede_idx` (`cittaSede` ASC),
CONSTRAINT `fk_dipartimento`
FOREIGN KEY (`codDirett`)
REFERENCES `mydb`.`impiegato` (`codice`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_sede`
FOREIGN KEY (`cittaSede`)
REFERENCES `mydb`.`sede` (`cittaSede`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`progetto`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`progetto` (
`nomeProgetto` VARCHAR(45) NOT NULL,
`budget` VARCHAR(45),
PRIMARY KEY (`nomeProgetto`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`partecipazione`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`partecipazione` (
`codImpieg` VARCHAR(45) NOT NULL,
`progetto` VARCHAR(45),
PRIMARY KEY (`codImpieg`),
INDEX `fk_progetto_idx` (`progetto` ASC),
CONSTRAINT `fk_impiegato`
FOREIGN KEY (`codImpieg`)
REFERENCES `mydb`.`impiegato` (`codice`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_progetto`
FOREIGN KEY (`progetto`)
REFERENCES `mydb`.`progetto` (`nomeProgetto`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
You have to match the impiegato row with the desired cognome with the row in sede with the same sede value, and that's what joins do:
select via
from sede s
join impiegato i
on s.sede = i.sede
where i.cognome = 'desiredCognome'

Cannot add foreign key constraint, workbench

I used workbench to implement a database schema, but I'm getting this error when using foreign keys in a certain table.
1215 - Cannot add foreign key constraint
SQL query:
CREATE TABLE IF NOT EXISTS `Gam3ty`.`Frequently_Used_Location` (
`idFrequently_Used_Location` INT NOT NULL,
`User_idUser` INT NOT NULL,
`User_College_idCollege` INT NOT NULL,
PRIMARY KEY (`idFrequently_Used_Location`,`User_idUser`,`User_College_idCollege`),
INDEX `fk_Frequently_Used_Location_User1_idx` (`User_idUser` ASC,`User_College_idCollege` ASC),
CONSTRAINT `fk_Frequently_Used_Location_User1`
FOREIGN KEY (`User_idUser` , `User_College_idCollege`)
REFERENCES `Gam3ty`.`User` (`idUser` , `College_idCollege`)
my SQL:
CREATE SCHEMA IF NOT EXISTS `Gam3ty` DEFAULT CHARACTER SET utf8 ;
USE `Gam3ty` ;
-- -----------------------------------------------------
-- Table `Gam3ty`.`Frequently_Used_Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`Frequently_Used_Location` (
`idFrequently_Used_Location` INT NOT NULL,
`User_idUser` INT NOT NULL,
`User_College_idCollege` INT NOT NULL,
PRIMARY KEY (`idFrequently_Used_Location`, `User_idUser`, `User_College_idCollege`),
INDEX `fk_Frequently_Used_Location_User1_idx` (`User_idUser` ASC, `User_College_idCollege` ASC),
CONSTRAINT `fk_Frequently_Used_Location_User1`
FOREIGN KEY (`User_idUser` , `User_College_idCollege`)
REFERENCES `Gam3ty`.`User` (`idUser` , `College_idCollege`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`Location` (
`idLocation` INT NOT NULL,
`Frequently_Used_Location_idFrequently_Used_Location` INT NOT NULL,
`Frequently_Used_Location_User_idUser` INT NOT NULL,
`Frequently_Used_Location_User_College_idCollege` INT NOT NULL,
`type` VARCHAR(45) NULL,
PRIMARY KEY (`idLocation`),
INDEX `fk_Location_Frequently_Used_Location1_idx` (`Frequently_Used_Location_idFrequently_Used_Location` ASC, `Frequently_Used_Location_User_idUser` ASC, `Frequently_Used_Location_User_College_idCollege` ASC),
CONSTRAINT `fk_Location_Frequently_Used_Location1`
FOREIGN KEY (`Frequently_Used_Location_idFrequently_Used_Location` , `Frequently_Used_Location_User_idUser` , `Frequently_Used_Location_User_College_idCollege`)
REFERENCES `Gam3ty`.`Frequently_Used_Location` (`idFrequently_Used_Location`, `User_idUser` , `User_College_idCollege`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`University`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`University` (
`idUniversity` INT NOT NULL,
`Location_idLocation` INT NOT NULL,
`Info` VARCHAR(45) NULL,
PRIMARY KEY (`idUniversity`, `Location_idLocation`),
INDEX `fk_University_Location1_idx` (`Location_idLocation` ASC),
CONSTRAINT `fk_University_Location1`
FOREIGN KEY (`Location_idLocation`)
REFERENCES `Gam3ty`.`Location` (`idLocation`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`College`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`College` (
`idCollege` INT NOT NULL,
`University_idUniversity` INT NOT NULL,
`Location_idLocation` INT NOT NULL,
`Info` VARCHAR(45) NULL,
`Staff` VARCHAR(45) NULL,
`Department` VARCHAR(45) NULL,
PRIMARY KEY (`idCollege`, `University_idUniversity`, `Location_idLocation`),
INDEX `fk_College_University1_idx` (`University_idUniversity` ASC),
INDEX `fk_College_Location1_idx` (`Location_idLocation` ASC),
CONSTRAINT `fk_College_University1`
FOREIGN KEY (`University_idUniversity`)
REFERENCES `Gam3ty`.`University` (`idUniversity`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_College_Location1`
FOREIGN KEY (`Location_idLocation`)
REFERENCES `Gam3ty`.`Location` (`idLocation`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`User`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`User` (
`idUser` INT NOT NULL,
`College_idCollege` INT NOT NULL,
`UserName` VARCHAR(45) NOT NULL,
`Password` VARCHAR(45) NOT NULL,
`E-mail` VARCHAR(45) NOT NULL,
`Social_media_accounts` VARCHAR(45) NULL,
`Gender` VARCHAR(45) NOT NULL,
`Job` VARCHAR(45) NOT NULL,
`Tel-num` BIGINT(11) NULL,
`Adress` VARCHAR(45) NULL,
PRIMARY KEY (`idUser`, `College_idCollege`, `UserName`),
INDEX `fk_User_College_idx` (`College_idCollege` ASC),
CONSTRAINT `fk_User_College`
FOREIGN KEY (`College_idCollege`)
REFERENCES `Gam3ty`.`College` (`idCollege`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
I checked the datatypes and they are all the same, also every foreign key is a primary key in it's original table.
Tables are created in order from top to bottom when you run a SQL script.
You can't create a foreign key that references a table that hasn't been created yet.
You must order the tables so that each table is created before any tables that reference it.
#Rahul wrote:
You need to refer all of the columns designated as primary key.
I agree this is a recommended practice, because otherwise you can create a foreign key where a given row references multiple rows in the parent table. This leads to ambiguous semantics. For instance, can you delete a row in the parent table if there's a row referencing it in the child table, but there's a second row in the parent table that satisfies the reference? This breaks the definition of referential integrity in standard SQL.
Nevertheless, InnoDB allows it. You can make a foreign key that references any left-most subset of columns of any key (unique or non-unique). It's a very bad idea, but InnoDB lets you do it and does not throw an error.
The following is crazy, but it's not an error to InnoDB:
create table foo (a int, b int, key (a, b));
create table bar (a int, foreign key (a) references foo(a));
That's cause table Gam3ty.User defines primary key on 3 columns as seen below but you are referencing only two of them. which creates partial functional dependency. You need to refer all of the columns designated as primary key
CREATE TABLE IF NOT EXISTS `Gam3ty`.`User` (
....
PRIMARY KEY (`idUser`, `College_idCollege`, `UserName`)
Your referencing table
FOREIGN KEY (`User_idUser` , `User_College_idCollege`)
REFERENCES `Gam3ty`.`User` (`idUser` , `College_idCollege`)

SQL: insert into 3 tables with a foreign key

I am trying to add data to 3 tables. The table "Gebruiker" is the parent table.
Wen i use the following code it gives me the follow error:
My SQL code:
SELECT *
FROM Gebruiker
INNER JOIN Inlog
ON Gebruiker.idGebruiker=Inlog.Gebruiker_idGebruiker
INNER JOIN GGevens
ON Gebruiker.idGebruiker=GGevens.Gebruiker_idGebruiker
INNER JOIN Domein
ON Gebruiker.Domein_idDomeint=Domein.idDomeint;
BEGIN;
INSERT INTO Gebruiker (Domein_idDomeint,idGebruiker)
VALUES (1,NULL);
INSERT INTO Inlog (Gebruiker_idGebruiker,UserName,UserPass)
VALUES (LAST_INSERT_ID(),'profile','drie');
INSERT INTO GGevens (Gebruiker_idGebruiker,Email,Voornaam,Tussenvoeg,Achternaam,Geslacht,Opleiding,GebDatum)
VALUES (LAST_INSERT_ID(),'aapje#peer.nl','Aapje','van','Drie',1,'Zeerslim','2014-11-11');
COMMIT;
Error:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`zolstm001`.`GGevens`, CONSTRAINT `fk_GGevens_Gebruiker1` FOREIGN KEY (`Gebruiker_idGebruiker`) REFERENCES `Gebruiker` (`idGebruiker`) ON DELETE NO ACTION ON UPDATE NO ACTION)
My database structure:
http://i.imgur.com/bxeQbhQ.png
I think its because the table "GGevens" needs a foreign key from the table "Gebruiker"
Does someone know how i can add this?
(LAST_INSERT_ID() does not work...
SQL code to create the tables:
-- MySQL Workbench Forward Engineering
SET #OLD_UNIQUE_CHECKS=##UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET #OLD_FOREIGN_KEY_CHECKS=##FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET #OLD_SQL_MODE=##SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema zolstm001
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema zolstm001
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `zolstm001` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `zolstm001` ;
-- -----------------------------------------------------
-- Table `zolstm001`.`Domein`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Domein` (
`idDomeint` INT NOT NULL AUTO_INCREMENT,
`Naam` VARCHAR(45) NOT NULL,
`OverigeGegevens` VARCHAR(45) NULL,
PRIMARY KEY (`idDomeint`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`Gebruiker`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Gebruiker` (
`idGebruiker` INT NOT NULL AUTO_INCREMENT,
`Domein_idDomeint` INT NOT NULL,
PRIMARY KEY (`idGebruiker`),
INDEX `fk_Gebruiker_Domein1_idx` (`Domein_idDomeint` ASC),
CONSTRAINT `fk_Gebruiker_Domein1`
FOREIGN KEY (`Domein_idDomeint`)
REFERENCES `zolstm001`.`Domein` (`idDomeint`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`GGevens`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`GGevens` (
`idGGevens` INT NOT NULL AUTO_INCREMENT,
`Gebruiker_idGebruiker` INT NOT NULL,
`Email` VARCHAR(45) NOT NULL,
`GebDatum` DATE NOT NULL,
PRIMARY KEY (`idGGevens`),
INDEX `fk_GGevens_Gebruiker1_idx` (`Gebruiker_idGebruiker` ASC),
CONSTRAINT `fk_GGevens_Gebruiker1`
FOREIGN KEY (`Gebruiker_idGebruiker`)
REFERENCES `zolstm001`.`Gebruiker` (`idGebruiker`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`Inlog`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Inlog` (
`idInlog` INT NOT NULL AUTO_INCREMENT,
`UserName` VARCHAR(45) NOT NULL,
`UserPass` VARCHAR(45) NOT NULL,
`Gebruiker_idGebruiker` INT NOT NULL,
PRIMARY KEY (`idInlog`),
INDEX `fk_Inlog_Gebruiker1_idx` (`Gebruiker_idGebruiker` ASC),
CONSTRAINT `fk_Inlog_Gebruiker1`
FOREIGN KEY (`Gebruiker_idGebruiker`)
REFERENCES `zolstm001`.`Gebruiker` (`idGebruiker`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`Startup`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Startup` (
`idStartup` INT NOT NULL AUTO_INCREMENT,
`Naam` VARCHAR(45) NOT NULL,
`Gebruiker_idGebruiker` INT NOT NULL,
PRIMARY KEY (`idStartup`),
INDEX `fk_Startup_Gebruiker1_idx` (`Gebruiker_idGebruiker` ASC),
CONSTRAINT `fk_Startup_Gebruiker1`
FOREIGN KEY (`Gebruiker_idGebruiker`)
REFERENCES `zolstm001`.`Gebruiker` (`idGebruiker`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`Reactie`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Reactie` (
`idReactie` INT NOT NULL AUTO_INCREMENT,
`Gebruiker_idGebruiker` INT NOT NULL,
`Bericht` VARCHAR(45) NOT NULL,
`Startup_idStartup` INT NOT NULL,
`Reactiecol` VARCHAR(45) NULL,
PRIMARY KEY (`idReactie`),
INDEX `fk_Reactie_Gebruiker1_idx` (`Gebruiker_idGebruiker` ASC),
INDEX `fk_Reactie_Startup1_idx` (`Startup_idStartup` ASC),
CONSTRAINT `fk_Reactie_Gebruiker1`
FOREIGN KEY (`Gebruiker_idGebruiker`)
REFERENCES `zolstm001`.`Gebruiker` (`idGebruiker`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Reactie_Startup1`
FOREIGN KEY (`Startup_idStartup`)
REFERENCES `zolstm001`.`Startup` (`idStartup`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`Category`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Category` (
`idCategory` INT NOT NULL AUTO_INCREMENT,
`Startup_idStartup` INT NOT NULL,
PRIMARY KEY (`idCategory`),
INDEX `fk_Category_Startup1_idx` (`Startup_idStartup` ASC),
CONSTRAINT `fk_Category_Startup1`
FOREIGN KEY (`Startup_idStartup`)
REFERENCES `zolstm001`.`Startup` (`idStartup`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`Unit`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`Unit` (
`idUnit` INT NOT NULL AUTO_INCREMENT,
`Startup_idStartup` INT NOT NULL,
PRIMARY KEY (`idUnit`),
INDEX `fk_Unit_Startup1_idx` (`Startup_idStartup` ASC),
CONSTRAINT `fk_Unit_Startup1`
FOREIGN KEY (`Startup_idStartup`)
REFERENCES `zolstm001`.`Startup` (`idStartup`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `zolstm001`.`SGegevens`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `zolstm001`.`SGegevens` (
`idSGegevens` INT NOT NULL AUTO_INCREMENT,
`Startup_idStartup` INT NOT NULL,
PRIMARY KEY (`idSGegevens`),
INDEX `fk_SGegevens_Startup1_idx` (`Startup_idStartup` ASC),
CONSTRAINT `fk_SGegevens_Startup1`
FOREIGN KEY (`Startup_idStartup`)
REFERENCES `zolstm001`.`Startup` (`idStartup`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=#OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=#OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=#OLD_UNIQUE_CHECKS;
I would change the INSERT INTO gebruiker to
INSERT INTO Gebruiker (Domein_idDomeint) VALUES (1);
Furthermore to get this working, you will need to use some programming code to help you. This can be done in the shape of a stored procedure.
CREATE PROCEDURE gebruikerProc (IN {your_params})
BEGIN
DECLARE lastId INT;
INSERT INTO Gebruiker (Domein_idDomeint) VALUES (1);
SET lastId=LAST_INSERT_ID();
INSERT INTO Inlog (Gebruiker_idGebruiker,UserName,UserPass)
VALUES (lastId,'profile','drie');
INSERT INTO GGevens (Gebruiker_idGebruiker,Email,Voornaam,Tussenvoeg,Achternaam,Geslacht,Opleiding,GebDatum)
VALUES (lastId,'aapje#peer.nl','Aapje','van','Drie',1,'Zeerslim','2014-11-11');
END;
One warning: Do not use TAB to indent your code in a stored procedure/function/trigger etc in MySQL. You will get an error. It just can not handle TAB.