13

次のSQLコマンドを実行すると:

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) 
VALUES (NULL,1,1,"user","pass");

次のエラーメッセージが表示されます。

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (`dm`.`test_usershosts`, CONSTRAINT `test_usershosts_ibfk_1` FOREIGN KEY (`
userid`) REFERENCES `test_users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE)

私のテーブル:

CREATE TABLE IF NOT EXISTS `test_users` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (userid)
) ENGINE=InnoDB;

INSERT INTO `test_users` (`userid`, `username`, `password) VALUES
(1120, 'guest', '12250170a9624f336ca24');

CREATE TABLE IF NOT EXISTS `test_hosts` (
`hid` int(11) NOT NULL AUTO_INCREMENT,
`UID` int(11) NOT NULL,
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (hid)
) ENGINE=InnoDB;

INSERT INTO `test_hosts` (`hid`, `UID`, `name`) VALUES (30, 10, 'MU');

CREATE TABLE IF NOT EXISTS `test_usershosts` (
`RID` int(11) NULL AUTO_INCREMENT,
`userid` int(11) ,
`hid` int(11) ,
`Usr` varchar(100) ,
`Pass` varchar(100) ,
PRIMARY KEY (RID),
INDEX (userid),
INDEX (hid),
FOREIGN KEY (userid) REFERENCES test_users (userid) 
    ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (hid) REFERENCES test_hosts (hid) 
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

私は多くの同様のケースを調べましたが、解決策を見つけることができませんでした。どんな助けでもいただければ幸いです。

4

3 に答える 3

23

この例外が発生する理由はtest_usershosts、の値がテーブルにuserID存在しないレコードをテーブルに挿入しているためですtest_users。の値と同じで、hidテーブルにも存在しませんtest_hosts

テーブルtest_usershostsはテーブルに依存しています:test_usersおよび test_hosts。したがって、テーブルにレコードを挿入するときは、およびの値が親テーブルにすでに存在していることを確認してtest_usershostsください:および 。hiduseridtest_userstest_hosts

このクエリを実行してみてください。確実に挿入されます。

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) 
VALUES (NULL,1120,30,'user','pass');

2つのテーブルで実行しているすべてのクエリに値を指定しているため、テーブルのオプション:とは必要ありませAUTO_INCREMENTtest_userstest_hosts

于 2012-12-15T12:00:46.163 に答える
2

test_usersゲストのUserID場合1120test_hostshidの場合= 30

変更する必要があります

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) VALUES (NULL,1,1,"user","pass");

に:

INSERT INTO test_usershosts (RID,userid,hid,Usr,Pass) VALUES (NULL,1120,30,"user","pass");
于 2012-12-15T12:00:24.493 に答える
-1

私の場合、それが誰かに役立つ場合に備えて。主キーを作成するときに通常何が起こるかという解決策を見つけるのに苦労していましたが、これも一意としてマークされています。しかし、私の場合は、プライマリとしてマークされているだけで、一意としてマークされていませんでした。ユニカのオプションが「開いている」ことに気づき、クリックするまで、関係を築きました。

次に、記録のために...主キーも一意であることを確認します。

于 2018-01-15T17:14:02.667 に答える