PHP+MySQLのALTER TABLEで外部制約キーを設定する際にエラーが発生したら確認すること
最近はホームページ関係が忙しく、それしか触っていなかったが、やっと少し落ち着いてきて久方ぶりにゼロベースのPHPを触った。
データベース(MySQL)周りの処理をちょちょっと書いていたのだが、PHPからMySQLにALTER TABLE ADD(DROP) CONSTRAINT FOREIGN KEYの処理を流す際にエラーが発生し、「あれ?」となったことがあったので覚書きしておく。
一個目は外部制約キーを設定(ADD)する際のエラー事項。
ALTER TABLE my_table_2 ADD CONSTRAINT fk_my_table_1 FOREIGN KEY (column, column...) REFERENCES my_table_1(column, column...);
以上を実行した際に、「Cannot add or update a child row: a foreign key constraint fails」と、表示される場合は、外部制約キーを設定する子テーブル(my_table_2)、及び、親テーブル(my_table_1)の内容の確認を行う。
このエラーは、PHPでSQL文を実行した際に、当該のテーブルどちらかにすでにデータが入っている場合に発生する。
そういった局面で、どうしてもPHP側からSQLを流したい場合は、これらを削除しなければならない。
まぁ、運用がすでに始まっているデータ入りのテーブルに、プログラム側から外部制約キーを追加すること自体がおかしいような気もするので妥当といえば妥当か。
ちなみにコマンドラインやphpMyAdmin等で生のSQLを実行した際にはこのエラーは発生しない。
データも保持したい場合、素直にSQLを直接流すのが吉。
二個目は外部制約キーを削除(DROP)する際のエラー事項。
ALTER TABLE my_table_2 DROP CONSTRAINT fk_my_table_1;
以上を流した際に「You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘xxx’」と、表示される場合は、SQLの構文を見直す必要がある。
で、これOracleとかでは普通に使えるSQLなんだが、MySQLだとどうやらこの構文形式は使えないらしい。
MySQLで外部結合キーを削除する場合は、以下のような構文になる。
ALTER TABLE my_table_2 DROP FOREIGN KEY fk_my_table_1;
ADDでCONSTRAINTが使えるのに、DROPでは使えないのはなんか腑に落ちない。
ここからこぼれ言。
再びちゃんとしたPHPをいじくりだして、DreamWeaverとかSublime Textじゃ物足りなくなったので、実にうんなん年ぶりくらいにeclipseを導入した。
やっぱプロジェクト管理やオブジェクト表示・デバッグがオールインワンでできる開発環境ってめっちゃ便利。
DreamWeaverのおまけ的な構文チェックや、Sublime Textのおおざっぱな構文チェックとは違って、プロジェクト内での各部のハイライトがきちんと機能するのは非常にありがたい(´・ω・`)