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