Postgresql:保持2个序列同步

时间:2010-03-25 17:03:11

标签: database postgresql sequences

有没有办法让2个序列在Postgres中保持同步?

我的意思是,如果我有:

table_A_id_seq = 1
table_B_id_seq = 1

如果我执行SELECT nextval('table_A_id_seq'::regclass)

我希望table_B_id_seq采用相同的table_A_id_seq

显然它在另一边必须是相同的。

我需要2个不同的序列,因为我必须修改Django中的一些约束(并且我无法在那里解决)。

4 个答案:

答案 0 :(得分:1)

这两个表必须以某种方式相关吗?我会将该关系封装在包含序列的查找表中,然后使用查找表替换您希望处理的两个表。

答案 1 :(得分:0)

您可以在INSERT上设置一个Table_A触发器来执行一些增加Table_B序列的代码。现在,每次在Table_A中插入新行时,它都会触发该触发器。

答案 2 :(得分:0)

我第一次想到这就是为什么你真的想这样做?这味道有点变质,有点像牛奶过了几天就过去了。

需要这两个seq保持相同值的情况是什么?

忽略“这看起来有点奇怪”的感觉我在肚子里你可以试试这个:

在table_a上放置一个触发器,在插入时执行此操作。 --set b seq to a。的值。

select setval('table_b_seq',currval('table_a_seq'));

这种方法的问题在于假设只有插入table_a才会改变table_a_seq值,而其他任何东西都不会增加table_a_seq。如果你可以忍受这种情况,那么这可能会以一种真正的hackish方式起作用,如果是我的话,我就不会将它发布到制作中。

如果你真的需要这个,为了使它更健壮,可以使用单个接口来增加table_a_seq,例如函数。并且只允许通过此函数操作table_a_seq。这样有一个接口可以增加table_a_seq,你也应该放 select setval('table_b_seq',currval('table_a_seq'));进入该职能部门。无论如何,table_b_seq将始终设置为等于table_a_seq。这意味着删除对table_a_seq的用户的任何授权,并且只授予他们对新函数执行grant。

答案 3 :(得分:0)

只需对两个表使用一个序列。除非您始终一次又一次地同步它们,否则无法使它们保持同步。序列不是事务安全的,它们总是向前滚动,从不向后滚动,甚至不是ROLLBACK。

编辑:一个序列也不起作用,并没有为两个表提供相同的编号。使用子查询来获取正确的数字,并仅对单个表使用单个序列。另一个表必须使用子查询。