0

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 つのスクリプトが作成されます)。その後に実行される外部キー ステートメント) の場合、次のようになります。

  1. ツールはテーブル作成スクリプトを実行し、正常に動作し、テーブルが作成されます
  2. ツールは add fk スクリプトを実行し、上記と同じ例外をスローしますが (今回は errno=121 を除く)、実際には FK が追加されます (!!!)

つまり、create table/FK ステートメントが同じスクリプトにある場合、例外がスローされ、何も作成されませんが、それらが異なるスクリプトである場合、ほぼ同じ例外がスローされますが、両方が作成されます。

これに関する任意の助けをいただければ幸いです。さらに明確にする必要がある場合はお知らせください。


いくつかの詳細情報:

1) これは私のボックスでのみ発生します。私の同僚は同じ問題を抱えていません。2) 「スクリプト」コマンドを使用して mysql コマンド ラインから実行すると、ツールを強制的にエラーにするスクリプトが正常に動作します。

4

1 に答える 1

1

我が神よ。

http://bugs.mysql.com/bug.php?id=41635

[スパム フィルターで 2 つのリンクを追加できないため、2 番目のリンクが削除されました。Google で「mysql connector / j errno 150」で検索すると 3 番目の結果です]

...

mySql5.1 には jdbc コネクタにバグがあり、FK を追加するための alter ステートメントが他のステートメントを含むスクリプト内にある場所を爆撃するようです。

3 つのステートメントを 3 つのスクリプトに分割すると、うまくいきました (スクリプトを共有していたために、独自のスクリプト内の 2 つの fk ステートメントで以前に試していた方法が爆撃されました!!)。また、同僚は MySql5.0 を使用しているため、影響はありませんでした。

ホーリーカウ、楽しい5時間でした。

于 2010-04-03T00:15:32.383 に答える