2009-10-15 2 views
0

При попытке использовать DDLUtils он всегда воспринимает значения id для столбцов, которые настроены на автоинкремент. Как я могу это предотвратить?Значения DDLUtils и автоинкремента

Например, у меня есть стол для собак с колонкой с именем ownerID. Идентификатор владельца столбца устанавливается на автоинкремент. Однако мой список владельцев не является непрерывным, есть пробелы (например, владельцы 2, 4, 5, 6, 7, 10 существуют, но не 1, 3, 8, 9, потому что с тех пор они были удалены). Проблема в том, что при восстановлении DdlToDatabase идентификаторы владельца сбрасываются до 1, 2, 3, 4 и т. Д. Это означает, что ссылки в моей таблице «Собаки» через идентификатор владельца теперь все неверны.

Как я могу заставить DDlUtils правильно импортировать значения для полей автоинкремента?

+0

Почему вы используете автоинкремент для столбца с ограничением FK? –

+0

Легко гарантировать, что owner.id уникален. –

+0

Хорошо. Но разве это не причина всех ваших проблем? –

ответ

0

Похоже, вы не можете импортировать значения из строк автоматического увеличения, что означает, что если они указаны в других таблицах, у вас проблемы. Вместо этого вам следует использовать UUID, если вы хотите пройти этот маршрут.

0

Я мало знаю об DDLUtils, но для такого рода операций ETL (экспорт, преобразование, загрузка) вам нужно немного поработать. Я знаю два способа, которые являются общими

  • Вставьте новую запись собаки. Сохраните карту старого идентификатора с новым идентификатором. При вставке в другую таблицу с идентификатором FK с идентификатором ownerID используйте карту, чтобы выбрать новый идентификатор.
 
    Original Dogs   New Dogs 
    [ID] [Name]   [ID] [Name] 
    2  Henry    1 Henry 
    5  Oliver    2 Oliver 

При вставке обе записи, вы в конечном итоге со старой на новую карту [2 => 1, 5 => 2]. Затем, когда вы вставляете любую запись, которая использует идентификатор 2, то вместо того, чтобы использовать 1.

  • Другим способом отключить автоматическое приращение характер таблицы при загрузке данных. Это конкретный DB.

Например, в SQL Server, вы можете использовать set identity_insert Dogs on

В MySQL вы можете вставить простые записи и указать идентификатор вы хотите.

0

Это было время назад - но у меня была та же проблема Прежде всего, ваша выбранная платформа должна поддерживать 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)); 
    } 
} 
Смежные вопросы