2012-05-18 47 views
1

我有一個名爲mail的表,其中有一個名爲deletedBy的外鍵列,它通過pk引用users表。當我創建一個新的郵件我想設置此字段爲空郵件未刪除,但是當我做我得到一個外鍵約束失敗錯誤。與外部引用在mysql中的問題

我完全理解錯誤,但我該如何解決它?

表: -

CREATE TABLE `mail` (
    `pk` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `from` int(11) unsigned NOT NULL, 
    `to` int(11) unsigned NOT NULL, 
    `subject` varchar(255) NOT NULL, 
    `message` text NOT NULL, 
    `dt` datetime NOT NULL, 
    `read` enum('0','1') NOT NULL DEFAULT '0', 
    `deletedby` int(11) unsigned DEFAULT '0', 
    PRIMARY KEY (`pk`), 
    KEY `from_mail__users_pk` (`from`), 
    KEY `to_mail__users_pk` (`to`), 
    KEY `deletedby_mail__users_pk` (`deletedby`), 
    CONSTRAINT `deletedby_mail__users_pk` FOREIGN KEY (`deletedby`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `from_mail__users_pk` FOREIGN KEY (`from`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `to_mail__users_pk` FOREIGN KEY (`to`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

錯誤信息: -

ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`ajfit`.`mail`, CONSTRAINT `deletedby_mail__users_pk` FOREIGN KEY (`deletedby`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION) 
SQL Statement: 
INSERT INTO `ajfit`.`mail` (`from`, `to`, `subject`, `message`, `read`) VALUES (31, 30, 'test', 'test', '0') 

感謝

安德魯

回答

4

因爲你不提供deletedby一個價值,0DEFAULT值用過的。但user表中pk爲0,因此沒有(假定)記錄,因此外鍵約束(正確)失敗。

正如你自己說的,你要deletedby擁有的NULL一個DEFAULT值,使得不檢查外鍵約束,直到替代值提供:

ALTER TABLE mail MODIFY deletedby int(11) unsigned DEFAULT NULL; 
+0

完美隊友謝謝你;) –

1

有沒有在用戶中的條目附有0的代碼表?因爲它對我來說看起來就是該表試圖找到入口0而沒有運氣。

2

mail表中的列deletedby應該包含從ID列中的值在user表上仍然有user表的id列的外鍵。

由於外鍵約束接受NULL值,所以在mail表中插入新行時,一種方法是將NULL值設置爲deletedby列。