web-dev-qa-db-ja.com

エラー1452:子行を追加または更新できません:外部キー制約が失敗します

以下に示すように、MySQL Workbench 5.2.47を使用して、MySQL 5.6.11に2つのテーブルを作成しました。

countryテーブル:

delimiter $$

CREATE TABLE `country` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INC

REMENT=2 DEFAULT CHARSET=utf8$$

state_table

delimiter $$

CREATE TABLE `state_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state_name` varchar(45) DEFAULT NULL,
  `country_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `country_fk` FOREIGN KEY (`id`) REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT=''$$

countryテーブルにはid 1の行が1つあります。これにより、1つの(子)行のみを子テーブルに挿入できますstate_table。さらに行を試行すると、次のエラーが発生します。

エラー1452:子行を追加または更新できません:外部キー制約が失敗しました(social_networking.state_table、CONSTRAINT country_fk FOREIGN KEY(id)REFERENCES countryid)ON DELETE CASCADE ON UPDATE CASCADE)

SQLステートメント:

INSERT INTO `social_networking`.`state_table` (`id`, `state_name`, `country_id`) VALUES ('2', 'xxx', '1')

実際、私はORM(JPA)を使用してこれらのテーブルをマップしようとしていますが、常にOneToOne関係しか表示されません。

何が欠けていますか?

6
Tiny

あなたはあなたの外部キー制約にタイプミスがあると思います、country_idcountryの外部キーである必要があります。 idが外部キーの場合、たまたま国の行と同じIDであるid = 1を取得するため、1行しか挿入できません。

CONSTRAINT `country_fk` FOREIGN KEY (`id`) 
    REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

たぶん

CONSTRAINT `country_fk` FOREIGN KEY (`country_id`) 
    REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

テストするSQLfiddle

9

まあ、私は答えを見つけます、解決策、私の英語はあまり上手ではありませんが、私はあなたを説明できると思います。トリガーを作成しようとした後、このエラーが発生しました。私のデータベースはphpmyadminで作成されました。このエラーは私を夢中にさせました。問題は、トリガーを作成する前に、テーブルと子に大量のデータをロードすることでした。テーブルは、親テーブルで一致しないデータでした。ej:子テーブルの「chat」には「id_jugador = 1」があり、親テーブルにはその「id_jugador」がありませんでした。これは私の間違いでした。あなた、アルゼンチン・ルツ;)

11
Roman Nuñez

私は同じ問題を抱えていて、それは間違った関係名ではありませんでした。
別のレコードに問題がありました。つまり、別のテーブルに存在しないレコードを登録しようとしたため、このエラーが発生しました。
レコードが別のテーブルに存在するかどうかを確認して、正しい関係を挿入します。そうでない場合、このエラーが表示されます。

これがお役に立てば幸いです。

example:
 table1(
    id1 INT PRIMARY KEY,
    name1 VARCHAR(50)
 )
 table2(
    id2,<--- want to add FOREIGN KEY to this field
    name2 VARCHAR(50)
 )

制約の外部キーを追加する前に、id1およびid2なので、相互にマッピングする値でidフィールドを更新する必要があります。

1
Tang Chanrith