DdlUtils: отложенная вставка
Для переноса БД из оракула в MySQL я использую ddlutils. Миграция схемы работает для моих целей, но вставка данных не выполняется из-за пропущенных строк. Следующая выдержка из файла журнала объясняет это:
[ddlToDatabase] About to execute SQL: INSERT INTO `RECORDSTATUS` (`NAME_ID`, RECORDSTATUS_ID`, `NAME`, `SORTVALUE`) VALUES (?, ?, ?, ?)
[ddlToDatabase] Inserted bean RECORDSTATUS:RECORDSTATUS_ID=0
...
[ddlToDatabase] Defering insertion of row NAME:LANGUAGE_ID=0;NAME_ID=5941 because it is waiting for:
[ddlToDatabase] RECORDSTATUS:RECORDSTATUS_ID=0
В базе данных есть строка RECORDSTATUS_ID=0. Кто-нибудь сталкивался с такой же проблемой? У кого-нибудь есть идея, в чем проблема?
2 ответа
У меня была похожая проблема при переходе с MySql на DerbyDB. В моем случае реальная проблема заключалась в том, что DDLUtils обрабатывает только те внешние ключи, которые предназначены для первичных ключей.
Таким образом, если у вас есть таблица MASTER, которая содержит какое-то уникальное поле не первичного ключа, и у вас есть таблица DETAILS, которая ссылается (внешний ключ) на это уникальное поле не первичного ключа, DDLUtils не может связать записи DETAILS с MASTER и поэтому не может вообще вставлять записи DETAIL,
Такая была ситуация в DDLUtils версии 1.0.
Я сделал несколько быстрых (и, возможно, грязных) модификаций кода, и это, похоже, решило эту проблему. Модифицированную версию можно скачать здесь (включая исходный код): http://www.arkki.fi/DdlUtils-1.0_mod_with_src.jar. Вы можете использовать его на свой страх и риск.
С наилучшими пожеланиями Кари Суракка
INSERT INTO `RECORDSTATUS` (`NAME_ID`, RECORDSTATUS_ID`, `NAME`, `SORTVALUE`) VALUES
должно быть:
INSERT INTO `RECORDSTATUS` (`NAME_ID`, `RECORDSTATUS_ID`, `NAME`, `SORTVALUE`) VALUES