31

私はSQLに非常に慣れていないので、単純なALTER TABLEを実行して新しい列を作成し、それを外部キーとして使用してデータベース内の別の単純なテーブルを参照しようとしています。両方のテーブルをInnoDBに変更しました

ただし、ALTER TABLEコードを実行すると、次のエラーが発生します。

Error   1452    Cannot add or update a child row: 
a foreign key constraint fails (`toys`.<result 2 when 
explaining filename '#sql-6d4_6'>, CONSTRAINT 
`#sql-6d4_6_ibfk_1` FOREIGN KEY (`toy_id`) REFERENCES `toys` (`toy_id`))    

以下は、両方のテーブルのDESCです。

表1:

FIELD       TYPE     NULL   KEY     EXTRA
toy_id      int(11)  NO     PRI     auto_increment
toy varchar(50) YES         

表2:

FIELD       TYPE        NULL   KEY     EXTRA
boy_id      int(11)     NO     PRI      auto_increment
boy         varchar(50) YES 

そして、これは私が実行しようとしていたALTERクエリです。

    ALTER TABLE boys
    ADD COLUMN toy_id INT NOT NULL,
    ADD CONSTRAINT toys_toy_id_fk
    FOREIGN KEY(toy_id)
    REFERENCES toys(toy_id);

私はそれを理解しようとしていたるところを見てきましたが、運がありませんでした。よろしくお願いします。この初心者に親切にしてください:)

編集:

両方のテーブルのSHOWCREATETABLEは次のとおりです。

表1:

    CREATE TABLE `toys` (
      `toy_id` int(11) NOT NULL AUTO_INCREMENT,
      `toy` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`toy_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

表2:

    CREATE TABLE `boys` (
      `boy_id` int(11) NOT NULL AUTO_INCREMENT,
      `boy` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`boy_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
4

1 に答える 1

45

列が親テーブルの値と一致する値に制約されているが、デフォルトのない新しい未入力の列であるためにNULL値しかない場合、0行を超えるテーブルにNOTNULL列を追加することはできません。 。

回避策は段階的に行うことです。列を追加しますが、NOT NULLを宣言せず、外部キーをまだ宣言しないでください。

ALTER TABLE boys
 ADD COLUMN toy_id INT;

次に、おもちゃのテーブルのいくつかの値と一致する有効なデータを入力します。

UPDATE boys SET toy_id = ...;

次に、列をNOT NULLに変更し、制約を作成します。

ALTER TABLE boys MODIFY COLUMN toy_id INT NOT NULL,
 ADD CONSTRAINT toys_toy_id_fk
 FOREIGN KEY(toy_id)
 REFERENCES toys(toy_id);
于 2013-03-11T22:32:02.623 に答える