0

我正在使用 Spring 的 JdbcDaoSupport 类和使用 MySQL 连接器/J 5.0 驱动程序 (driverClassName=com.mysql.jdbc.driver) 的 DriverManagerDataSource。url 中的 allowMultiQueries 设置为 true。

我的应用程序是我们最近开发的一个内部工具,它在一个目录中一个接一个地执行 sql 脚本(允许我们为给定的日期重新创建我们的模式和引用表数据等,但我离题了)。sql 脚本有时包含多个语句(因此允许MultiQueries),因此一个脚本可以创建表、为该表添加索引等。

当包含在其中一个文件中添加外键约束的语句时,就会出现问题。如果我有一个看起来像...的文件

--(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)

并且没有插入表和外键。

另外,特别奇怪:如果我从上面显示的脚本中取出外键语句,然后将它们放在自己的脚本中,然后执行(所以我现在有 1 个脚本只包含 create table 语句,1 个脚本带有 add之后执行的外键语句)然后发生的是:

  1. 工具执行创建表脚本,工作正常,创建表
  2. 工具执行 add fk 脚本,抛出与上面相同的异常(这次除了 errno=121),但实际上添加了 FK(!!!)

换句话说,当创建表/FK 语句在同一个脚本中时,会抛出异常并且什么都不会创建,但是当它们是不同的脚本时,会抛出几乎相同的异常,但都会创建两个东西。

对此的任何帮助将不胜感激。如果您希望我澄清更多信息,请告诉我。


更多信息:

1)这只发生在我的盒子上。我的同事没有遇到同样的问题。2) 强制工具出错的脚本在使用“script”命令从 mysql 命令行执行时工作正常

4

1 回答 1

1

我的上帝。

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

[第二个链接被删除,因为垃圾邮件过滤器不允许我添加 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 回答