1

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

我的意思是,如果我有:

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

4 回答 4

1

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

于 2010-05-20T09:49:04.137 回答
0

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

于 2010-03-25T17:12:05.857 回答
0

看到这个我的第一个想法是为什么你真的想这样做?这闻起来有点变质,有点像牛奶过期几天后的味道。

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

忽略我肚子里的“这似乎有点奇怪”的感觉,你可以试试这个:

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

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

这种方法的问题在于,假设只有对 table_a 的插入会改变 table_a_seq 的值,而不会增加 table_a_seq 的值。如果你能忍受,这可能会以一种非常骇人听闻的方式工作,如果这是我的电话,我不会发布到生产环境中。

如果你真的需要这个,为了让它更健壮,创建一个单一的接口来增加 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 的任何授权,只授予他们对新函数的执行授权。

于 2010-03-25T21:19:06.440 回答
0

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

编辑:一个序列也不行,不会给你两个表相同的数字。使用子查询来获取正确的数字,并为单个表使用单个序列。另一个表必须使用子查询。

于 2010-03-25T21:22:59.993 回答