2012-03-15 100 views
0

我正在使用java和MySQL工作的項目。 我的問題是關於MySQL的一部分。MySQL約束錯誤1452

我正在處理數據庫,我試圖測試一切,但我無法實現任何數據。

我得到的所有的時間一個錯誤: 錯誤代碼:1452不能添加或更新子行:外鍵約束失敗(pokerinschrijving .CONSTRAIN inschrijving_ibfk_1外鍵(Lid)參考文獻toernooiTid)ON DELETE CASCADE ON UPDATE CASCADE)

這是我的數據庫:

CREATE DATABASE IF NOT EXISTS poker; 
USE poker; 

DROP TABLE IF EXISTS Locatie; 
CREATE TABLE Locatie (
Lid int(12) NOT NULL AUTO_INCREMENT, 
Lnaam Varchar(100) NOT NULL, 
Ladress varchar(100) NOT NULL, 
Lopp double, 
PRIMARY KEY (Lid) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `Locatie` (`Lid`,`Lnaam`,`Ladress`,`Lopp`) VALUES 
(10000001,'Grote zaal Den Bos','Lange weg 34, Den Bos',54.5), 
(10000002,'Casino Vlaardingen','Achterbaan 119, Vlaardingen',2500.5), 
(10000003,'Homerson Casino','Oxfordstraat 19, Zoetermeer',1000), 
(10000004,'Van der valk casino','Dorpsweg 45, Sasseheim',9899); 

DROP TABLE IF EXISTS Speler; 
CREATE TABLE Speler (
Sid int(12) NOT NULL AUTO_INCREMENT, 
Snaam varchar(50) NOT NULL, 
Se_mail varchar(80) NOT NULL, 
Sadress varchar(40) NOT NULL, 
Swoonplaats varchar(35) NOT NULL, 
Spostcode varchar(6) NOT NULL, 
Stelnr int(19) NOT NULL, 
Sgesl ENUM('M', 'F'), 
Sgbd date NOT NULL, 
Srating int(10) NOT NULL, 
Sgewonnen_geld double NOT NULL, 
Sbekende_speler boolean, 
PRIMARY KEY (Sid) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `Speler` (`Sid`,`Snaam`,`Se_mail`,`Sadress`,`Swoonplaats`,`Spostcode`,`Stelnr`,`Sgesl`,`Sgbd`,`Srating`,`Sgewonnen_geld`,`Sbekende_speler`) VALUES 
(20000003,'Jan Peter','[email protected]','Scherium weg 20','Den bos','2123IE',062586475,'M','1983-05-18',1250,209.00,False), 
(20000001,'Roy Henson','[email protected]','Shindori straat 231','Leiden','3212IO',0623568974,'M','1986-08-21',700,2310.00,True), 
(20000009,'Willium Ransom','[email protected]','Hooftweg 521','Groningen','1251UI',0623541289,'M','1979-04-29',1250,20315.00,True), 
(20000002,'Rhindia Rosenberg','[email protected]','Dorpstraat 210','Den Haag','2621',0622775412,'F','1990-11-21',275,10321.00,False); 

DROP TABLE IF EXISTS Toernooi; 
CREATE TABLE Toernooi (
Tid int(12) NOT NULL AUTO_INCREMENT, 
Tnaam varchar(100) NOT NULL, 
Tmax_speler int(5) NOT NULL, 
Tinleggeld double NOT NULL, 
Ttype varchar(25) NOT NULL, 
Tdatum datetime NOT NULL, 
Lid int(12) NOT NULL, 
PRIMARY KEY (Tid), 
FOREIGN KEY (Lid) REFERENCES Locatie (Lid) 
ON DELETE RESTRICT 
ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `Toernooi` (`Tid`,`Tnaam`,`Tmax_speler`,`Tinleggeld`,`Ttype`,`Tdatum`,`Lid`) VALUES 
(30000001,'MCi',340,75.00,'Professional','2012-06-21 19:00:00',10000002), 
(30000002,'chaos',200,150.00,'Professional','2012-07-15 21:00:00',10000003), 
(30000003,'Homerson!',400,45,'Amatuer','2012-08-25 20:30:00',10000001), 
(30000004,'Valkerin',1000,20,'Amatuer','2012-09-01 23:59:59',10000004); 

DROP TABLE IF EXISTS MasterClass; 
CREATE TABLE MasterClass (
Mid int(12) NOT NULL AUTO_INCREMENT, 
Mmin_rating int(10) NOT NULL, 
Mmax_spelers int(3) NOT NULL, 
Mniveau varchar(50) NOT NULL, 
Mdatum datetime NOT NULL, 
Sid int(12) NOT NULL, 
Lid int(12) NOT NULL, 
PRIMARY KEY (mid), 
FOREIGN KEY (Lid) REFERENCES Locatie (Lid) 
ON DELETE RESTRICT 
ON UPDATE CASCADE, 
FOREIGN KEY (Sid) REFERENCES Speler (Sid) 
ON DELETE CASCADE 
ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `MasterClass` (`Mid`,`Mmin_rating`,`Mmax_spelers`,`Mniveau`,`Mdatum`,`Sid`,`Lid`) VALUES 
(40000001,1100,50,'Professional','2012-05-21 22:00:00',20000009,10000001), 
(40000002,3500,120,'Amateur','2012-09-07 15:00:00',20000001,10000002); 

DROP TABLE IF EXISTS Status; 
CREATE TABLE Status (
Tid int(12) NOT NULL, 
Sid int(12) NOT NULL, 
ronde varchar(25) NOT NULL, 
tafel int(3) NOT NULL, 
winst double NOT NULL, 
startrating int(10) NOT NULL, 
eindrating int(10) NOT NULL, 
plaats int(5) NULL, 
PRIMARY KEY (Tid,Sid), 
FOREIGN KEY (Tid) REFERENCES Toernooi (Tid) 
ON DELETE CASCADE 
ON UPDATE CASCADE, 
FOREIGN KEY (Sid) REFERENCES Speler (Sid) 
ON DELETE CASCADE 
ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `Status` (`Tid`,`Sid`,`ronde`,`tafel`,`winst`,`startrating`,`eindrating`) VALUES 
(30000004,20000003,20,5,0.00,800,700), 
(30000004,20000001,12,2,0.00,750,600), 
(30000004,20000002,4,19,6700.00,1000,1250), 
(30000004,20000009,9,12,3400.00,250,275); 

DROP TABLE IF EXISTS Inschrijving; 
CREATE TABLE Inschrijving (
Iid int(12) NOT NULL, 
Sid int(12) NOT NULL, 
Ibetaald boolean, 
PRIMARY KEY (Iid,Sid), 
FOREIGN KEY (Iid) REFERENCES Toernooi (Tid) 
ON DELETE CASCADE 
ON UPDATE CASCADE, 
FOREIGN KEY (Iid) REFERENCES MasterClass (Mid) 
ON DELETE CASCADE 
ON UPDATE CASCADE, 
FOREIGN KEY (Sid) REFERENCES Speler (Sid) 
ON DELETE CASCADE 
ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `Inschrijving` (`Iid`,`Sid`,`Ibetaald`) VALUES 
(40000001,20000003,true), //Its goes wrong here!!! This is where the error come 
(40000002,20000002,false), 
(30000003,20000001,true), 
(30000004,20000009,false); 

我希望有人能幫幫我! 謝謝!

回答

0

您有一個有趣的外鍵結構:Iid同時指向兩個表。當您添加一個新的Inschrijving.Iint時,必須有兩個參考表中具有相同Iid值的行!

CREATE TABLE Inschrijving (
Iid int(12) NOT NULL, 
!! 
FOREIGN KEY (Iid) REFERENCES Toernooi (Tid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY (Iid) REFERENCES MasterClass (Mid) ON DELETE CASCADE ON UPDATE CASCADE, 
+0

換句話說,必須有一個Tid和一個具有相同值的Mid:Exp:Iid = 1,那麼Mid = 1和Tid = 1對不對? – 2012-03-15 12:37:07

+0

是的,我認爲,MySQL應該獨立檢查所有的約束,如果一個失敗,整個操作失敗。 – biziclop 2012-03-15 14:27:17

0

的外鍵

FOREIGN KEY (Iid) REFERENCES Toernooi (Tid) 
FOREIGN KEY (Iid) REFERENCES MasterClass (Mid) 

在Inschrijving的表格確定指標似乎引用了錯誤的字段或錯誤的表。 Iid已經有了一個外鍵。而這些引用也沒有語義上的意義。