Liquibase loadUpdateData仅在derby中执行Insert

时间:2018-02-14 16:22:32

标签: java derby liquibase

我想在我的数据库中使用新值,我在本文档中看到http://www.liquibase.org/documentation/changes/load_update_data.html 已经存在可能的解决方案但是一旦我创建了更改日志,只执行了一个插入而不是重复键的更新。

我的数据库是DERBY 10.12.1.1和Liquibase 3.5.1

这是我的变更集

 <changeSet author="mva" id="changes">
  <loadUpdateData encoding="UTF-8"
                tableName="vi_prop_def"
                primaryKey="pk_prop_def"
                file="vi_prop_def-type.csv">
  <column name="guid" type="STRING"/>
  <column name="name" type="STRING"/>
  <column name="description" type="STRING"/>
  <column name="value_type" type="STRING"/>
  <column name="property_order" type="NUMERIC"/>
  <column name="group_guid" type="STRING"/>
  <column name="required" type="NUMERIC"/>
  <column name="is_collection" type="NUMERIC"/>
</loadUpdateData>

这是执行的陈述

Reason: liquibase.exception.DatabaseException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'PK_PROP_DEF' defined on 'VI_PROP_DEF'. [Failed SQL: INSERT INTO APP.vi_prop_def (guid, name, description, value_type, property_order, group_guid, required, is_collection) VALUES ('b7ede117-4925-4e44-83ac-dfb10e8fc0f8', 'productionBeginDate', 'my production Date', 'DATE', 38, 'f2262f52-0cd9-4d69-ac19-dce871aa4a1e', 1, 0)]

确实已经插入了一个值,但我预计liquibase会生成一个插入,然后对dublicate key进行derby特定更新。

2 个答案:

答案 0 :(得分:0)

您似乎准确地按照此页面上的说明进行操作:http://www.liquibase.org/documentation/changes/load_update_data.html,但有一个例外:您有varchar(255)而不是列出的字符串作为类型。我似乎记得他们的文档中存在一些不一致之处,因此您可能是正确的,而且他们的文档不正确。

此外,您是否可能在导入文件中有重复数据?如果更改类型不起作用,我建议使用一个更简单的示例来表示假表,例如只有id和name列的“users”,以便在将新用户附加到该假名单时验证它是否按预期工作。 / p>

最后一件令我印象深刻的事情是,你有一个不是你的PK的guid专栏。为什么你的指导不是PK?也许你有一个guid和一个独特的键约束,但它的方式似乎很奇怪。验证您的架构是否符合您的假设以防万一。

答案 1 :(得分:0)

我查看了InserOrUpdateGenerator(3.5.1),显然Derby和许多其他DBMS没有实现,所以我想我必须采取漫长的路线 - &gt;删除 - &gt;插入。不幸的是,他们不保持文件准确:(