0

尝试使用DDLUtils时,它似乎总是接管设置为自动增量的列的 id 值。我怎样才能防止这种情况?

例如,我有一个 Dogs 表,其中有一列称为 ownerID。列 ownerID 设置为自动增量。但是我的所有者列表不是连续的,存在差距(例如,ownerID 的 2、4、5、6、7、10 存在但不存在 1、3、8、9,因为它们已被删除)。问题是在 DdlToDatabase 恢复时,所有者 ID 被重置为 1、2、3、4 等等。这意味着我的 Dogs 表中通过 ownerID 的链接现在都是不正确的。

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

4

3 回答 3

0

我对DDLUtils了解不多,但是对于这种ETL(export,transform,load)操作,还得多做一些工作。我知道两种常见的方式

  • 插入新的 Dog 记录。保留旧 ID 到新 ID 的映射。当插入到另一个具有与 ownerID 的 FK 的表中时,使用映射来选择新的 ID。
    原来的狗 新的狗  
    [身份证] [姓名] [身份证] [姓名]
    2亨利 1亨利
    5 奥利弗 2 奥利弗

当您插入两条记录时,您最终会得到一个 [ 2 => 1, 5 => 2 ] 的旧映射到新映射。然后,当您插入任何使用 ID 为 2 的记录时,您将使用 1。

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

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

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

于 2009-12-04T04:55:04.590 回答
0

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

于 2010-02-09T19:09:16.440 回答
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));
    }
}
于 2013-06-24T13:26:27.737 回答