2012-03-15 9 views
0

私はjavaとMySQLで動作するプロジェクトに取り組んでいます。 私の質問はMySQLの部分についてです。MySQLの制約エラー1452

私はデータベースで作業しています。すべてをテストしようとしていますが、データを実装できません。

私はすべての時間のエラーを取得: エラーコードを:1452は、子行を追加または更新できません:。外部キー制約は、DELETE ON(pokerinschrijving .CONSTRAIN inschrijving_ibfk_1 FOREIGN KEY(LidtoernooiTidを参照)に失敗しました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は同時に2つのテーブルを指しています。新しい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

言い換えれば、同じ値Exp:Iid = 1、Mid = 1、Tid = 1のTidとMidが必要ですか? –

+0

はい、私は、MySQLはすべての制約を個別にチェックする必要があり、失敗した場合は操作全体が失敗すると思います。 – biziclop

0

Inschrijvingのあなたのテーブルのdefintionの外部キー

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

は、間違ったフィールドまたは間違ったテーブルを参照するように思えます。すでにIidのための外部キーがあります。そして、これらの参照は、意味的にも意味をなさない。