将GenerationType.IDENTITY更改为GenerationType.SEQUENCE(并返回)PostgreSQL

时间:2018-11-26 15:59:02

标签: postgresql jpa orm key

我们拥有使用GenerationType.IDENTITY包含实体的数据库。它有一些技术问题,我用GenerationType.SEQUENCE替换了它,因为我误解了SEQUENCE的作用。现在,我们有了所有以+1增量编号的数据库表,直到开始使用SEQUENCE为止->那里的编号在所有表之间共享,并且由于它在整个系统中共享,因此在每个表中迅速增加到巨大的空白。

现在我恢复为IDENTITY时,它开始编号,上次使用IDENTITY时在该位置停止。 IDENTITY可以(如果发生)会提供与SEQUENCE的编号冲突的编号吗? (很遗憾,我无法真正测试它,因为最后一个IDENTITY条目例如为9000,而第一个SEQUENCE为25密耳-这是因为数据库在一个月的时间内有很多添加/删除操作)

有什么办法可以从最后一个SEQUENCE值开始为IDENTITY编号吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

IDENTITY和SEQUENCE之间的区别(至少在PostgreSQL中是这样),正如您注意到的那样,IDENTITY为每个表创建一个序列,而SEQUENCE对所有表使用一个全局序列。

假设您有一个名为MyEntity(或my_entity作为表名)的实体-具有IDENTITY策略-应该有一个名为类似的序列: my_entity_id_sequence 。 SEQUENCE的名称(取决于JPA的实现)可能类似于 hibernate_sequence

如果您可以访问数据库(例如,使用),则只需检查IDENTITY序列并设置其值:。

ALTER SEQUENCE my_entity_id_sequence RESTART with_your_value;

例如,其中 with_your_value 可以

SELECT max(id)+1 FROM my_entity;