DDLUtils и автоинкрементные значения
При попытке использовать DDLUtils он всегда принимает значения идентификаторов для столбцов, для которых установлено автоинкремент. Как я могу предотвратить это?
Например, у меня есть таблица Dogs со столбцом с именем ownerID. Для столбца ownerID установлено автоинкремент. Однако мой список владельцев не является непрерывным, есть пробелы (например, существуют 2, 4, 5, 6, 7, 10 владельца идентификатора, но не 1, 3, 8, 9, потому что они были с тех пор удалены). Проблема в том, что при восстановлении DdlToDatabase идентификаторы владельца сбрасываются на 1, 2, 3, 4 и т. Д. Это означает, что ссылки в моей таблице Dogs через ownerID теперь все неверны.
Как я могу заставить DDlUtils правильно импортировать значения для автоинкрементных полей?
3 ответа
Похоже, вы не можете импортировать значения из строк с автоинкрементом, что означает, что, если на них есть ссылки в других таблицах, у вас проблемы. Вместо этого вам следует использовать UUID, если вы хотите пойти по этому пути.
Я не знаю много о DDLUtils, но для такого рода операций ETL (экспорт, преобразование, загрузка) вам придется проделать немного больше работы. Я знаю два распространенных способа
- Вставьте новую запись собаки. Сохраните карту старого идентификатора для нового идентификатора. При вставке в другую таблицу, которая имеет FK для ownerID, используйте карту, чтобы выбрать новый идентификатор.
Оригинальные Собаки Новые Собаки [ID] [Имя] [ID] [Имя] 2 Генри 1 Генри 5 Оливер 2 Оливер
Когда вы вставляете обе записи, вы получаете старую-новую карту [ 2 => 1, 5 => 2 ]. Затем, когда вы вставляете любую запись, которая использует идентификатор 2, вы вместо этого используете 1.
- Другой способ - отключить автоматическое приращение таблицы при загрузке данных. Это специфично для БД.
Например, в SQL Server вы можете использоватьset identity_insert Dogs on
В MySQL вы можете просто вставить записи и указать желаемый идентификатор.
Это было некоторое время назад, но у меня была та же проблема. Решение: Прежде всего, выбранная вами платформа должна поддерживать identityOverrideAllowed.
Platform mySqlPlatform = PlatformFactory.createNewPlatformInstance(mysqlDataSource);
mySqlPlatform.getPlatformInfo().setIdentityOverrideAllowed(true);
Вы также должны установить isIdentityOverrideOn. Пример того, как его установить, вы можете найти в исходном коде. DDLUtils
org.apache.ddlutils.platform.mssql.MsSqlPlatform...
/**
* Determines whether we need to use identity override mode for the given table.
*
* @param table The table
* @return <code>true</code> if identity override mode is needed
*/
private boolean useIdentityOverrideFor(Table table)
{
return isIdentityOverrideOn() &&
getPlatformInfo().isIdentityOverrideAllowed() &&
(table.getAutoIncrementColumns().length > 0);
}
/**
* {@inheritDoc}
*/
protected void beforeInsert(Connection connection, Table table) throws SQLException
{
if (useIdentityOverrideFor(table))
{
MSSqlBuilder builder = (MSSqlBuilder)getSqlBuilder();
connection.createStatement().execute(builder.getEnableIdentityOverrideSql(table));
}
}
/**
* {@inheritDoc}
*/
protected void afterInsert(Connection connection, Table table) throws SQLException
{
if (useIdentityOverrideFor(table))
{
MSSqlBuilder builder = (MSSqlBuilder)getSqlBuilder();
connection.createStatement().execute(builder.getDisableIdentityOverrideSql(table));
}
}