【问题标题】:Spring's JdbcDaoSupport (using MySQL Connector/J) fails after executing sql that adds FKSpring 的 JdbcDaoSupport(使用 MySQL 连接器/J)在执行添加 FK 的 sql 后失败
【发布时间】:2010-04-02 22:40:06
【问题描述】:

我正在使用 Spring 的 JdbcDaoSupport 类和 DriverManagerDataSource,使用 MySQL 连接器/J 5.0 驱动程序 (driverClassName=com.mysql.jdbc.driver)。 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 个脚本使用之后执行的添加外键语句)然后会发生什么:

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

换句话说,当创建表/FK 语句在同一个脚本中时,会引发异常并且不会创建任何内容,但是当它们是不同的脚本时,会引发几乎相同的异常,但都会创建两者。

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


更多信息:

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

【问题讨论】:

    标签: java mysql spring jdbc mysql-error-1005


    【解决方案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 个小时很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-31
      • 2022-01-17
      • 2018-03-03
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多