【发布时间】: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 个脚本使用之后执行的添加外键语句)然后会发生什么:
- 工具执行创建表脚本,工作正常,创建表
- 工具执行 add fk 脚本,抛出与上面相同的异常(这次除了 errno=121),但实际上添加了 FK (!!!)
换句话说,当创建表/FK 语句在同一个脚本中时,会引发异常并且不会创建任何内容,但是当它们是不同的脚本时,会引发几乎相同的异常,但都会创建两者。
对此的任何帮助将不胜感激。如果您希望我澄清更多信息,请告诉我。
更多信息:
1) 这只发生在我的盒子上。我的同事没有遇到同样的问题。 2)当使用“script”命令从mysql命令行执行时,强制工具出错的脚本工作正常
【问题讨论】:
标签: java mysql spring jdbc mysql-error-1005