我正在处理一个使用 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 函数是一个想法,该函数可以神奇地调用该函数并在插入完成后删除函数。