2015-05-15 90 views
-1

我已經創建了幾個表,其中一個是父表和三個子表。MySQL外鍵:無法添加或更新子行:外鍵約束失敗

CREATE TABLE `members` (
`memberID` int(11) NOT NULL AUTO_INCREMENT, 
`username` varchar(255) NOT NULL, 
`password` varchar(60) NOT NULL, 
PRIMARY KEY (`memberID`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 

CREATE TABLE `pets` (
`petsID` int(11) NOT NULL AUTO_INCREMENT, 
`Gender` varchar(25) NOT NULL, 
`Age` varchar(25) NOT NULL, 
`Size` varchar(25) NOT NULL, 
`memberID` int(11) NOT NULL, 
PRIMARY KEY (`petsID`), 
KEY `fk_pets` (`memberID`), 
CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`memberID`) REFERENCES `members` (`memberID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

CREATE TABLE `owner` (
`ownerID` int(11) NOT NULL AUTO_INCREMENT, 
`nameOwner` varchar(25) NOT NULL, 
`ageOwner` varchar(25) NOT NULL, 
`bioOwner` varchar(800) NOT NULL, 
`memberID` int(11) NOT NULL, 
PRIMARY KEY (`ownerID`), 
KEY `fk_owner` (`memberID`), 
CONSTRAINT `owner_ibfk_1` FOREIGN KEY (`memberID`) REFERENCES `members` (`memberID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 

CREATE TABLE `service` (
`serviceID` int(11) NOT NULL AUTO_INCREMENT, 
`nameService` varchar(25) NOT NULL, 
`webService` varchar(25) NOT NULL, 
`memberID` int(11) NOT NULL, 
PRIMARY KEY (`serviceID`), 
KEY `fk_service` (`memberID`), 
CONSTRAINT `service_ibfk_1` FOREIGN KEY (`memberID`) REFERENCES `members` (`memberID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

測試出我的桌子後,我收到了此錯誤:

INSERT INTO owner (nameOwner, ageOwner, bioOwner) VALUES ('', '', '') 
Cannot add or update a child row: a foreign key constraint fails (`DB`.`owner`, CONSTRAINT `owner_ibfk_1` FOREIGN KEY (`memberID`) REFERENCES `members` (`memberID`) ON DELETE CASCADE ON UPDATE CASCADE) 

我已經嘗試過截斷我的父表,但它仍然有這個錯誤出現。我在數據庫設計的初學者,所以請解釋一下像我5.

+2

確定 - 就像你五歲那樣:你正試圖在沒有可引用父代的子行中插入一行。 –

+0

@HoboSapiens有一些非常錯誤的「OK - 就像你是五...」 – Ajoy

+1

@Ajoy - 我只是在他自己的要求中強制OP。讀他最後一句話。 –

回答

0
CONSTRAINT `owner_ibfk_1` FOREIGN KEY (`memberID`) REFERENCES `members` (`memberID`) 

在主表此約束意味着,在該表的每一行需要有一個有效的memberID。如果它存在於members表的memberID列中,則僅考慮有效

insert聲明:

INSERT INTO owner (nameOwner, ageOwner, bioOwner) VALUES ('', '', '') 

提供一個memberID要插入所以無論正在使用顯然不是在members表。因此違反約束。

最簡單的修復方法是在您的insert聲明中提供有效的memberID聲明,該聲明已存在於members中。

通過舉例的方式,這會工作,假設你還沒有一個42members

insert into members (memberID, username, password) values (
    42, 
    'paxdiablo', 
    'never_you_mind'); 
insert into owner (nameOwner, ageOwner, bioOwner, memberID) values (
    'Pax Diablo', 
    'too damn old', 
    'no idea what this should be', 
    42); 

如果你不知道會員ID應該是什麼,你可以使用類似:

insert into owner (nameOwner, ageOwner, bioOwner, memberID) 
    select 'Pax Diablo', 
      'too damn old', 
      'no idea what this should be', 
      memberID 
     from members where username = 'paxdiablo'; 

雖然你可能想members.memberID是唯一的。


實際發生的位置取決於MySQL版本,您正在使用,以及是否它的運行嚴格SQL模式與否。我想從內存中,它會或者失敗insert或使用零作爲默認值。

+0

那麼我必須編輯插入語句到INSERT INTO所有者(nameOwner,ageOwner,bioOwner,memberID)VALUES('xx','xx','xx','')?我會像上面介紹的那樣保持VALUE空嗎?感謝您的幫助btw,我真的很感激它。 – laimingl

+0

@laimingl,這隻有在'members'表中有''''的成員id時纔會起作用,並且它會將所有插入鏈接到該行。這不太可能是你想要的。相反,你需要在'members'中找到正確的記錄,並用其他數據將'memberID'插入'owner'。 – paxdiablo

相關問題