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 のときにテーブルに追加された行は、一貫性が検証されません。