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文を発行するようにして解決。

プライバシーポリシー お問い合わせ