2009-07-31 31 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

アプリケーションがゼロのような領域フィールドにnullを挿入していますか? デバッグするには、外部キーをオフにしてレコードを挿入し、そこにあるものを確認します。それはnullか、値に設定されましたか? –

+0

良いチップ。私は外部キーをオフにし、私のアプリケーションが0にDBに入っていることを認識しました。私のアプリケーションでは、変数が設定されていない場合でもNULLを割り当てます。その後、DBの領域フィールドは整数なので、NULLは0と解釈されます。ありがとう! – littleK

答えて

1

あなたのアプリケーションは、にNULLの値を入れません。

query logを有効にして、PHPがテーブルに挿入しようとしているものを正確に確認してください。

+0

問題は、私のDB内のフィールドがintとして設定されているため、NULLを0と解釈するためです...ありがとう。 – littleK

+0

この問題に遭遇する可能性のある人は誰でも、SQLクエリではNULL値を挿入しないで回避することができます。 – littleK