2012-03-15 102 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已经有了一个外键。而这些引用也没有语义上的意义。