有没有办法让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中的一些约束(并且我无法在那里解决)。
答案 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。
编辑:一个序列也不起作用,并没有为两个表提供相同的编号。使用子查询来获取正确的数字,并仅对单个表使用单个序列。另一个表必须使用子查询。