如何在具有液碱数据库填充之后更正Postgres序列



我正在处理一个使用 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 实际上填充了数据库,但是当我需要添加新地址时会发生麻烦,并且我得到了一些主键违规的例外。我知道我需要修复序列,但是在应用程序启动时填充数据库后如何执行此操作?

提前谢谢你!

只需添加另一个调用变更集中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>

但是,仅当没有同时向表进行并发插入时,这才能正常工作

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

也许生成一个 PostgreSQL 函数是一个想法,该函数可以神奇地调用该函数并在插入完成后删除函数。

相关内容

  • 没有找到相关文章

最新更新