gpt4 book ai didi

java - Spring的JdbcDaoSupport(使用MySQL Connector/J)执行添加FK的sql后失败

转载 作者:行者123 更新时间:2023-11-29 15:03:53 25 4
gpt4 key购买 nike

我使用 Spring 的 JdbcDaoSupport 类和 DriverManagerDataSource,使用 MySQL Connector/J 5.0 驱动程序 (driverClassName=com.mysql.jdbc.driver)。 url 中的 allowedMultiQueries 设置为 true。

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

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

--(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 个仅包含创建表语句的脚本和 1 个脚本)以及之后执行的添加外键语句)然后会发生什么:

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

换句话说,当 create table/FK 语句位于同一个脚本中时,会抛出异常并且不会创建任何内容,但是当它们是不同的脚本时,会抛出几乎相同的异常,但都会创建两个内容。

对此的任何帮助将不胜感激。如果您希望我进一步澄清,请告诉我。

<小时/>

更多信息:

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

最佳答案

我的上帝。

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

[第二个链接已删除,因为垃圾邮件过滤器不允许我添加 2 个链接。在 Google 中搜索“mysql Connector/j errno 150”,这是第三个结果]

...

看起来 mySql5.1 的 jdbc 连接器有一个错误,它会轰炸脚本中用于添加 FK 的 alter 语句与任何其他语句的位置。

当我将 3 个语句分成 3 个脚本时,它起作用了(我之前在自己的脚本中尝试使用 2 个 fk 语句的方式仍然被轰炸,因为它们共享一个脚本!!)。另外,我的同事使用的是MySql5.0,所以这对他没有影响。

天哪,这 5 个小时真是太有趣了。

关于java - Spring的JdbcDaoSupport(使用MySQL Connector/J)执行添加FK的sql后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2569565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com