【问题标题】:Liquibase loadUpdateData is doing only Insert in derbyLiquibase loadUpdateData 只在 derby 中插入
【发布时间】:2018-07-25 07:08:16
【问题描述】:

我想在我的数据库中添加新值,并且我在此文档中看到了 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 会生成一个插入,然后是对重复键的特定于 derby 的更新。

【问题讨论】:

    标签: java derby liquibase


    【解决方案1】:

    您似乎准确地遵循了此页面上的说明:http://www.liquibase.org/documentation/changes/load_update_data.html,但有一个例外:您将 varchar(255) 而不是 string 列为类型。我似乎记得他们的文档中存在一些不一致之处,因此您可能是正确的,而他们的文档不正确。

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

    让我感到奇怪的最后一件事是你有一个不是你的 pk 的 guid 列。为什么你的指导不是PK?也许你有一个 guid 和一个唯一的键约束,但它的方式看起来很奇怪。验证您的架构是否符合您的假设,以防万一。

    【讨论】:

    • guid 是我的父键,但是我使用的主键约束似乎有效,因为通过复制我有我真正想要的但我需要更新语句,插入一个绝对正确跨度>
    【解决方案2】:

    我查看了 InserOrUpdateGenerator (3.5.1),显然没有 Derby 和许多其他 DBMS 的实现,所以我想我必须走很长的路 -> 删除 -> 插入。不幸的是,他们没有保持他们的文档准确:(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2015-10-08
      • 2012-02-23
      • 1970-01-01
      • 2018-04-17
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多