アプリケーションのバグにつながる興味深い効果が偶然発見されました。
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'
要求は特定のテーブルスキーマに関連付けられておらず、スキーマを変更した後でも実行できるようです。 実際、準備されたステートメントは、ステートメントが作成された時点の列のリストに配置されます。
実際には、問題は次のように明らかになりました。データベースとの通信を担当するクラスは準備されたステートメントをキャッシュします。 実行時にデータベーススキーマを変更する必要がある場合、キャッシュされたステートメントが破損しました(必要な理由を尋ねないでください。 注意してください!