DELETE文発行時のERROR 1109 (42S02): Unknown table '*****' in MULTI DELETE
現在やっている案件のフレームワークはSQLを自動で生成してくれる。
検索条件や取得項目を配列で指定し、JOINなんかも配列で指定するので、共通条件なんかを定義して使いまわせるので便利だ。
で、DBにはMySQLを使っているわけだが、DELETE文を発行した時に問題が発生した。
出力されたエラーの内容は
ERROR 1109 (42S02): Unknown table TestTable in MULTI DELETE
※「TestTable」というのは対象テーブル名。WEBに公開する為に置き換えています。
さっぱりわからんw
マルチデリートなんかしてないぞ????
発行されたSQLを見てみる
delete `TestTable` from test_db_1.`test_table` as `TestTable`;
う〜ん、フレームワークが勝手に発行しているSQLなだけに、普通のDELETE文とは違うが、PhpMyAdminからSQLを実行しても問題ない。
ではなんだろう・・・
この案件のDB設計は特殊(?)で、意味もなく複数のデータベースが存在しており、1機能に必要なデータを取得するのにあっちこっちのデータベースを参照しなくてはならない。
その為か、コネクションの「現在接続しているデータベース」がころころと変わる。
で、これが関連しているのだろうと思ってテストしてみた。
以下、テストした環境
データベース | test_db_1 | test_db_2 |
---|---|---|
テーブル | test_table | なし |
パターン1(成功)
現在のコネクションはtest_db_1にある状態(use)で以下のSQLを発行
use test_db_1; delete `TestTable` from test_db_1.`test_table` as `TestTable`; → Query OK, 0 rows affected (0.00 sec)
パターン2(エラー)
現在のコネクションはtest_db_2にある状態(use)で以下のSQLを発行
use test_db_2; delete `TestTable` from test_db_1.`test_table` as `TestTable`; → ERROR 1109 (42S02): Unknown table 'TestTable' in MULTI DELETE
パターン3(成功)
現在のコネクションはtest_db_2にある状態(use)で以下のSQLを発行
use test_db_2; delete from test_db_1.`test_table`; → Query OK, 0 rows affected (0.00 sec)
ふむふむ・・・
どうやら、テーブル別名を使用する事となるDELETE文を、別のDBから発行することはできないみたい。
たぶん、以下がこの件に関する公式フォーラムでのやりとり。
http://bugs.mysql.com/bug.php?id=27525
結局、フレームワークの拡張基底クラスで、DELETE文の発行前にUSE文を発行するようにして解決。