DDLUtils和自动增量值

时间:2009-10-15 17:20:28

标签: java database jdbc auto-increment ddlutils

尝试使用DDLUtils时,似乎总是会接管设置为自动增量的列的id值。我该如何防止这种情况?

例如,我有一个Dogs表,其中包含一个名为ownerID的列。列ownerID设置为autoincrement。但是我的所有者列表不是连续的,存在间隙(例如,ownerID的2,4,5,6,7,10存在但不是1,3,8,9,因为它们已被删除)。问题是在DdlToDatabase还原时,所有者ID将重置为1,2,3,4等。这意味着我的Dogs表中通过ownerID的链接现在都不正确。

如何让DDlUtils正确导入自动增量字段的值?

3 个答案:

答案 0 :(得分:0)

我对DDLUtils知之甚少,但对于这种ETL(导出,转换,加载)操作,你需要做更多的工作。我知道两种常见的方式

  • 插入新的Dog记录。将旧ID的映射保留为新ID。当插入具有FK到ownerID的另一个表时,使用该地图选择新ID。
    Original Dogs           New Dogs  
    [ID]  [Name]            [ID]  [Name]
    2     Henry              1    Henry
    5     Oliver             2    Oliver

当您插入两个记录时,最终会得到[2 =>的旧到新地图1,5 => 2]。 然后,当您插入任何使用ID为2的记录时,请改为使用1。

  • 另一种方法是在加载数据时禁用表的自动增量性质。这是特定于DB的。

例如,在SQL Server中,您可以使用 set identity_insert Dogs on

在MySQL中,您可以简单地插入记录并指定所需的ID。

答案 1 :(得分:0)

看起来你无法从自动增量行中导入值,这意味着如果在其他表中引用它们,则会遇到麻烦。相反,如果你想走这条路,你应该做的就是使用UUID。

答案 2 :(得分: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));
    }
}