MariaDB 10.4.24で発生する「Foreign key constraint is incorrectly formed」エラーの原因と解決方法
MariaDB 10.4.24 における「Foreign key constraint is incorrectly formed」エラーの解説
このエラーが発生する理由は、主に以下の2つです。
-
外部キー制約の定義に誤りがある
-
参照先のテーブルやデータに問題がある
エラーメッセージには、以下の情報が含まれています。
- エラーコード: 1042
- エラーメッセージ: Foreign key constraint is incorrectly formed
- テーブル名: 外部キー制約を定義しているテーブル名
- 制約名: 外部キー制約の名前
- 参照先のテーブル名: 参照先のテーブル名
- 参照先の列名: 参照先の列名
エラーを解決するには、以下の手順を試してください。
-
MariaDB のバージョンを確認する
-
必要に応じて、データベース管理ツールを使用する
- 使用している MariaDB のバージョン
- 外部キー制約の定義
- エラーメッセージの詳細
-- テーブル定義
CREATE TABLE `parent` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `child` (
`id` INT NOT NULL AUTO_INCREMENT,
`parent_id` INT NOT NULL,
`name` VARCHAR(255) NOT NULL,
FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`),
PRIMARY KEY (`id`)
);
-- データ挿入
INSERT INTO `parent` (`name`) VALUES ('親テーブル1');
INSERT INTO `parent` (`name`) VALUES ('親テーブル2');
INSERT INTO `child` (`parent_id`, `name`) VALUES (1, '子テーブル1');
INSERT INTO `child` (`parent_id`, `name`) VALUES (2, '子テーブル2');
-- 外部キー制約違反
INSERT INTO `child` (`parent_id`, `name`) VALUES (3, '子テーブル3');
-- エラーメッセージ
ERROR 1042 (23000): Foreign key constraint is incorrectly formed
最後の INSERT
ステートメントは、parent
テーブルに存在しない ID を parent_id
列に指定するため、外部キー制約違反が発生します。
外部キー制約の定義方法
CREATE TABLE
ステートメントを使用してテーブルを作成する際に、FOREIGN KEY
句を使用して外部キー制約を定義することができます。
CREATE TABLE `child` (
`id` INT NOT NULL AUTO_INCREMENT,
`parent_id` INT NOT NULL,
`name` VARCHAR(255) NOT NULL,
FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`),
PRIMARY KEY (`id`)
);
上記の例では、child
テーブルの parent_id
列が parent
テーブルの id
列を参照する外部キー制約を定義しています。
ALTER TABLE ステートメント
既存のテーブルに外部キー制約を追加するには、ALTER TABLE
ステートメントを使用することができます。
ALTER TABLE `child`
ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`);
外部キー制約のオプション
外部キー制約を定義する際に、以下のオプションを指定することができます。
-
ON DELETE
参照先のテーブルのデータが削除された際に、子テーブルのデータに対してどのような処理を行うかを指定します。
CASCADE
: 子テーブルの関連するデータも削除するRESTRICT
: 子テーブルのデータの削除を禁止するSET NULL
: 子テーブルの関連する列を NULL に設定するNO ACTION
: 何もしない
- 外部キー制約は、参照整合性を保つために重要な役割を果たします。
- 外部キー制約を定義する際には、参照先のテーブルと列名が一致していることを確認する必要があります。
- 外部キー制約を削除するには、
ALTER TABLE
ステートメントを使用してDROP FOREIGN KEY
句を指定します。
mariadb