【问题标题】:How to correct Postgres sequence, after a database population with liquibase?在使用 liquibase 填充数据库后,如何更正 Postgres 序列?
【发布时间】:2014-12-02 17:40:30
【问题描述】:

我正在处理一个将 Spring MVC 与 JPA、Liquibase 和 Postgres 结合使用的项目。我有一些人口脚本 (SQL),其中包含州、城市、邮政编码和地址,并且表/值之间具有适当的关系。

<changeSet id="10" author="cezar">
    <sql dbms="postgresql"
         endDelimiter=";"
         splitStatements="true"
         stripComments="true">
    INSERT INTO ..... VALUES (.....);
    </sql>
</changeSet>

好吧,一切都很好,Liquibase 实际上填充了数据库,但是当我需要添加新地址时会出现问题,并且我遇到了一些违反主键的异常。我知道我需要修复序列,但是在应用程序启动时填充数据库后我该怎么做?

提前谢谢你!

【问题讨论】:

  • 创建一个变更集,重新创建索引,将其初始值设置为比插入的数据高一。此问题高度依赖于插入的数据,因此在技术上超出了 liquibase 的范围。这是一个主要关注模式管理的工具

标签: spring postgresql jpa liquibase


【解决方案1】:

您可以在您的变更集中添加另一个调用setval() 的 SQL 语句:

<changeSet id="10" author="cezar">
    <sql dbms="postgresql"
         endDelimiter=";"
         splitStatements="true"
         stripComments="true">
    INSERT INTO ..... VALUES (.....);
    SELECT setval('sequence_name', (select max(id_column) from the_table));
    </sql>
</changeSet>

这只有在没有同时插入到表中时才能正常工作

【讨论】:

    【解决方案2】:

    这确实是一个真正的问题。我们面临同样的问题,最终在外部脚本中添加了此类数据。不理想,因为它在 Liquibase 上下文之外运行,但我们只需要一种方法来“编码”一些复杂的逻辑来生成一些数据以及以编程方式对现有数据进行一些更改。

    也许一个想法是生成一个 PostgreSQL 函数来发挥作用,在插入完成后调用该函数并删除函数。

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2017-11-30
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多