hene

hene.dev

Cannot delete or update a parent row: a foreign key constraint fails の対応

Cannot delete or update a parent row: a foreign key constraint fails の対応

テーブルを削除しようとしたときに、エラーが出た。

エラー

外部キー制約をつけているため、テーブルを削除できなかった。

$ mysql -u ${USERNAME} -p${DB_PASSWORD} database_name -e 'DROP TABLE IF EXISTS tests;'
ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: a foreign key constraint fails

対応

SET FOREIGN_KEY_CHECKS = 0; で、外部キー制約を一時的に無効化して削除した。

$ mysql -u ${USERNAME} -p${DB_PASSWORD} database_name -e 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS tests; SET FOREIGN_KEY_CHECKS = 1;'

調査時のメモ

無効化しないほうが良さそうなので、削除時だけ無効化した。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.4 サーバーシステム変数

1 (デフォルト) に設定すると、InnoDB テーブルについての外部キー制約が検査されます。0 に設定すると、そのような制約は無視されます。

foreign_key_checks を 0 に設定すると、データ定義ステートメントにも影響します。DROP SCHEMA は、スキーマの外部のテーブルによって参照されている外部キーを持つテーブルをスキーマが含む場合であってもスキーマをドロップし、DROP TABLE は、別のテーブルによって参照されている外部キーを持つテーブルをドロップします。

foreign_key_checks を 1 に設定すると、既存のテーブルデータのスキャンがトリガーされません。したがって、foreign_key_checks = 0 のときにテーブルに追加された行は、一貫性が検証されません。

参考

関連記事