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