我正在使用一个使用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实际上填充了数据库,但是当我需要添加一个新地址时会出现问题,并且我会遇到一些主键违规的例外情况。我知道我需要修复序列,但是在应用程序启动后如何在数据库填充后执行此操作?
提前谢谢!
答案 0 :(得分:3)
您可以在changeSet中添加另一个调用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>
但是,如果同时没有对表进行并发插入,这将只能正常工作
答案 1 :(得分:0)
这确实是一个真正的问题。我们遇到了同样的问题,最后在外部脚本中添加了这些数据。不理想,因为它在Liquibase上下文之外运行,但我们只需要一种“编码”一些复杂逻辑的方法来生成一些数据,并以编程方式对现有数据进行一些更改。
在插入完成后,生成一个可以实现魔术,调用函数和删除函数的PostgreSQL函数也许是一个想法。