MySQL準備済みステートメントはテーブルの変更を転送しません

Upd:以下で説明する効果は、MySQL 5.1.25未満でのみ表示されます。



アプリケーションのバグにつながる興味深い効果が偶然発見されました。

mysql> create table test(a int,b int);

Query OK, 0 rows affected (0.11 sec)



mysql> prepare ps from "select * from test";

Query OK, 0 rows affected (0.00 sec)

Statement prepared



mysql> alter table test drop column b;

Query OK, 0 rows affected (0.27 sec)

Records: 0 Duplicates: 0 Warnings: 0



mysql> execute ps;

ERROR 1054 (42S22): Unknown column 'testdb.test.b' in 'field list'






要求は特定のテーブルスキーマに関連付けられておらず、スキーマを変更した後でも実行できるようです。 実際、準備されたステートメントは、ステートメントが作成された時点の列のリストに配置されます。



実際には、問題は次のように明らかになりました。データベースとの通信を担当するクラスは準備されたステートメントをキャッシュします。 実行時にデータベーススキーマを変更する必要がある場合、キャッシュされたステートメントが破損しました(必要な理由を尋ねないでください。 注意してください!



All Articles