テーブルの外部キー制約確認方法(MySQL4.1)
需要があるのかどうか不明ですが、ひとまず必要にかられてやってみたので書いときます。
使うシチュエーション
レコード削除したいんだけどdeleteすると
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
と出てできない、という場合。
まあテーブル定義書やER図確認しろよとかありますが、ひとまず置いといて。
地道に簡単に消していく方法
1. コンソールでdelete from table_name where id=xxx などを実行し、上記エラーが出る。
2. 以下のコマンドを実行する
show innodb status;
3. 色々表示される中に"LATEST FOREIGN KEY ERROR"という欄があり、下記のような感じの記述がある。
delete from TABLE_2 where ID=1 Foreign key constraint fails for table `scheme_1/TABLE_1`: , CONSTRAINT `TABLE_1_ibfk_1` FOREIGN KEY (`COLUMN_1`) REFERENCES `TABLE_2` (`COLUMN_2`) ON DELE TE NO ACTION ON UPDATE NO ACTION
この場合TABLE_2テーブルのレコードを消そうとしたらscheme_1.TABLE_1.COLUMN_1に設定された外部キー制約に引っかかって失敗しており、それはTABLE_2.COLUMN_2カラムを参照しているという事が分かる。
4. 3で分かった原因レコード(この例だとTABLE_1テーブルのレコード)を消す。
5. また外部キーエラーが出たら2から繰り替えして、元を辿って順番に消す。
あるテーブルに関する外部キー制約を全て知る方法
show table status from スキーマ名 like 'テーブル名'; show create table テーブル名;
のどちらかで分かります。ただしこれは、そのテーブルから他のテーブルへの参照が分かるだけなので、逆にそのテーブルを外部キーとして設定している他のテーブルが分かりません。
そちらを知りたい場合は
show table status from スキーマ名;
として全テーブル分を出力し、結果をgrepします。えらいベタなのでもっとスマートなやり方がありそうなものですが、ちょっと調べた範囲では見つかりませんでした。