MySQL Connector/J 5.0 ドライバー (driverClassName=com.mysql.jdbc.driver) を使用して、Spring の JdbcDaoSupport クラスを DriverManagerDataSource で使用しています。allowMultiQueries が URL で true に設定されています。
私のアプリケーションは、最近開発した社内ツールで、ディレクトリ内の SQL スクリプトを 1 つずつ実行します (スキーマを再作成し、特定の日付のテーブル データを参照することができますが、余談になります)。SQLスクリプトには複数のステートメントが含まれている場合があるため(したがってallowMultiQueries)、1つのスクリプトでテーブルを作成したり、そのテーブルにインデックスを追加したりできます.
これらのファイルのいずれかに外部キー制約を追加するステートメントを含めると、問題が発生します。次のようなファイルがある場合...
--(column/constraint names are examples)
CREATE TABLE myTable (
fk1 BIGINT(19) NOT NULL,
fk2 BIGINT(19) NOT NULL,
PRIMARY KEY (fk1, fk2)
);
ALTER TABLE myTable ADD CONSTRAINT myTable_fk1
FOREIGN KEY (fk1)
REFERENCES myOtherTable (id)
;
ALTER TABLE myTable ADD CONSTRAINT myTable_fk2
FOREIGN KEY (fk2)
REFERENCES myOtherOtherTable (id)
;
JdbcTemplate.execute は UncategorizedSqlException をスローし、次のエラー メッセージとスタック トレースを示します。
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [ THE SQL YOU SEE ABOVE LISTED HERE ];
SQL state [HY000]; error code [1005]; Can't create table 'myDatabase.myTable' (errno: 150); nested exception is java.sql.SQLException: Can't create table 'myDatabase.myTable' (errno: 150)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
テーブルと外部キーは挿入されません。
また、特に奇妙です: 上記のスクリプトから外部キー ステートメントを取り出し、後で実行される独自のスクリプトに配置すると (したがって、create table ステートメントのみを含む 1 つのスクリプトと、add を含む 1 つのスクリプトが作成されます)。その後に実行される外部キー ステートメント) の場合、次のようになります。
- ツールはテーブル作成スクリプトを実行し、正常に動作し、テーブルが作成されます
- ツールは add fk スクリプトを実行し、上記と同じ例外をスローしますが (今回は errno=121 を除く)、実際には FK が追加されます (!!!)
つまり、create table/FK ステートメントが同じスクリプトにある場合、例外がスローされ、何も作成されませんが、それらが異なるスクリプトである場合、ほぼ同じ例外がスローされますが、両方が作成されます。
これに関する任意の助けをいただければ幸いです。さらに明確にする必要がある場合はお知らせください。
いくつかの詳細情報:
1) これは私のボックスでのみ発生します。私の同僚は同じ問題を抱えていません。2) 「スクリプト」コマンドを使用して mysql コマンド ラインから実行すると、ツールを強制的にエラーにするスクリプトが正常に動作します。