尝试使用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正确导入自动增量字段的值?
答案 0 :(得分:0)
我对DDLUtils知之甚少,但对于这种ETL(导出,转换,加载)操作,你需要做更多的工作。我知道两种常见的方式
Original Dogs New Dogs [ID] [Name] [ID] [Name] 2 Henry 1 Henry 5 Oliver 2 Oliver
当您插入两个记录时,最终会得到[2 =>的旧到新地图1,5 => 2]。 然后,当您插入任何使用ID为2的记录时,请改为使用1。
例如,在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));
}
}