Spring JdbcDaoSupport (с использованием MySQL Connector/J) завершается ошибкой после выполнения sql, который добавляет FK

Я использую класс Spring JdbcDaoSupport с DriverManagerDataSource, используя драйвер MySQL Connector/J 5.0 (driverClassName=com.mysql.jdbc.driver). allowMultiQueries имеет значение true в URL.

Мое приложение - это собственный инструмент, который мы недавно разработали и который выполняет сценарии 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 сценарий только с оператором create table и 1 сценарий с add операторы внешнего ключа, которые выполняются после этого), тогда происходит следующее:

  1. инструмент выполняет скрипт создания таблицы, работает нормально, таблица создана
  2. инструмент выполняет сценарий add fk, выдает то же исключение, что и показано выше (за исключением errno=121 на этот раз), но FK фактически добавляются (!!!)

Другими словами, когда операторы create table/FK находятся в одном и том же сценарии, генерируется исключение, и ничего не создается, но когда они представляют собой разные сценарии, генерируется почти идентичное исключение, но обе вещи создаются.

Любая помощь по этому вопросу будет принята с благодарностью. Пожалуйста, дайте мне знать, если вы хотите, чтобы я уточнил что-нибудь еще.


Еще немного информации:

1) Это происходит только на моей коробке. Мой коллега не получает ту же проблему. 2) Скрипт, который вынуждает инструмент работать с ошибками, работает нормально при запуске из командной строки mysql с помощью команды "script"

1 ответ

О Господи.

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

а также

[2-я ссылка удалена, потому что фильтр спама не позволяет мне добавить 2 ссылки. Ищите в Google "mysql connector / j errno 150", и это третий результат]

...

Похоже, что mySql5.1 имеет ошибку с jdbc-коннектором, когда он бомбит, когда оператор alter для добавления FK находится в скрипте с любым другим оператором.

Когда я разбил свои 3 утверждения на 3 сценария, это сработало (как я пытался раньше, когда 2 оператора fk в их собственном сценарии все еще подвергались бомбардировке, потому что они разделяли сценарий!!). Кроме того, мой коллега использует MySql5.0, так что это не повлияло на него.

Святая корова, это было весело 5 часов.

Другие вопросы по тегам