在使用liquibase进行数据库填充之后,如何纠正Postgres序列?

时间:2014-12-02 17:40:31

标签: spring postgresql jpa liquibase

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

提前谢谢!

2 个答案:

答案 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函数也许是一个想法。