以下に示すように、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
、CONSTRAINTcountry_fk
FOREIGN KEY(id
)REFERENCEScountry
(id
)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
関係しか表示されません。
何が欠けていますか?
あなたはあなたの外部キー制約にタイプミスがあると思います、country_id
はcountry
の外部キーである必要があります。 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
まあ、私は答えを見つけます、解決策、私の英語はあまり上手ではありませんが、私はあなたを説明できると思います。トリガーを作成しようとした後、このエラーが発生しました。私のデータベースはphpmyadminで作成されました。このエラーは私を夢中にさせました。問題は、トリガーを作成する前に、テーブルと子に大量のデータをロードすることでした。テーブルは、親テーブルで一致しないデータでした。ej:子テーブルの「chat」には「id_jugador = 1」があり、親テーブルにはその「id_jugador」がありませんでした。これは私の間違いでした。あなた、アルゼンチン・ルツ;)
私は同じ問題を抱えていて、それは間違った関係名ではありませんでした。
別のレコードに問題がありました。つまり、別のテーブルに存在しないレコードを登録しようとしたため、このエラーが発生しました。
レコードが別のテーブルに存在するかどうかを確認して、正しい関係を挿入します。そうでない場合、このエラーが表示されます。
これがお役に立てば幸いです。
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フィールドを更新する必要があります。