【问题标题】:liquibase + jdbctemplate update statement - autoincrement issueliquibase + jdbctemplate 更新语句 - 自动增量问题
【发布时间】:2020-10-13 10:45:19
【问题描述】:

在 liquibase changset 中,我正在向数据库中插入一些记录

<changeSet id="test" author="xyz">
        <insert tableName="testtable">
            <column name="id" value="1"/>
            <column name="name" value="testdata"/>
        </insert>
</changeSet>

然后使用 jdbcTemplate 我尝试使用实例 update() 方法插入新行。

   jdbcTemplate.update(
        "INSERT INTO test.testtable(name) VALUES (?)",
        new Object[] {
          someObject.getName()
        });

第一次运行上述方法时,我收到错误,表中已存在具有此 ID 的记录。但是,当我重复操作时,我成功地增加了 ID,值为 2。

如何将 liquibase 和 jdbcTemplate 集成在一起来消除这个问题?我希望 jdbcTemplate 会以某种方式识别此 ID 1 已被占用并插入具有递增、非冲突、唯一 ID 的数据。

我正在使用 postgres。

是否有任何选项可以在不删除带有硬编码 ID 值的 liquibase 条目的情况下执行此操作?

【问题讨论】:

  • 您可以尝试通过删除列 id 来运行 changeSet。如果启用了自动递增,那么 id 列应该由 db 填充。

标签: postgresql liquibase jdbctemplate


【解决方案1】:

我希望 jdbcTemplate 会以某种方式识别此 ID 1 已被占用并以递增方式插入数据, 无冲突的唯一 ID。

这不会发生。 Liquibase 查看变更集是否已在环境中运行(通过检查变更集 ID 是否存在于 databasechangelog 表中)。如果它不存在,它将运行变更集。就这么简单,Liquibase 不会为您考虑任何事情,您必须确保插入物在任何合理的条件下都能正常工作。

我确实喜欢上面评论中的建议,即不要插入 id,而是使用自动增量,如果您想始终插入并让 id 递增。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多