2009-07-31 61 views
1

嘿大家,我在MySQL以下「用戶」表:MySQL的外鍵約束混亂

CREATE TABLE `users` (
    `uid` int(11) NOT NULL auto_increment, 
    `fname` varchar(50) NOT NULL, 
    `lname` varchar(50) NOT NULL, 
    `role` varchar(75) NOT NULL, 
    `region` tinyint(4) unsigned default NULL, 
    `username` varchar(25) NOT NULL, 
    `password` varchar(75) NOT NULL, 
    `new_pass` varchar(5) default NULL, 
    PRIMARY KEY (`uid`), 
    UNIQUE KEY `username` (`username`), 
    KEY `role` (`role`), 
    KEY `region` (`region`), 
    CONSTRAINT `users_ibfk_3` FOREIGN KEY (`role`) REFERENCES `role` (`role`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `users_ibfk_4` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 

我設置爲外鍵區表「區域」 - region.region」

請注意,users.region聲明爲NULL。我的印象是,在MySQL中,僅當密鑰設置爲NOT NULL時纔會強制執行外鍵約束。

然而,當我嘗試插入一個用戶在我的PHP應用程序中的NULL區,我得到以下錯誤:

ERROR: Cannot add or update a child row: a foreign key constraint fails (`reslife4/users`, CONSTRAINT `users_ibfk_4` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON DELETE CASCADE ON UPDATE CASCADE) 

,但如果我要添加這個用戶我的PHP應用程序之外,例如在phpMyAdmin中,它會允許我。

有誰知道發生了什麼事?

+1

您確定您的應用程序將空字段插入區域字段而不是零字符? 要調試,我會關閉外鍵,插入記錄,並看看有什麼。它是否爲空或它是否設置爲一個值。 – 2009-07-31 13:28:27

+0

好的提示。我關閉了外鍵,並意識到我的應用程序正在向數據庫輸入0,即使在我的應用程序中,如果未設置該變量,那麼我也會爲其分配NULL。然後我意識到,DB中的區域字段是一個整數,所以NULL將被解釋爲0.謝謝! – littleK 2009-07-31 13:40:40

回答

1

您的應用程序將一個非NULL值放入region

啓用query log,看看你的PHP試圖插入到表中。