我想在我的数据库中使用新值,我在本文档中看到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特定更新。
答案 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;插入。不幸的是,他们不保持文件准确:(