2010-03-25 2 views
1

Есть ли способ сохранить 2 последовательности синхронизированы в Postgres?Postgresql: сохранить 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 (и этого я не могу решить там).

+0

Когда вы пишете свою последовательность, возможно ли иметь одно значение последовательности = остальные, m и наоборот? –

ответ

1

Эти две таблицы должны быть связаны каким-то образом? Я бы инкапсулировал эти отношения в таблицу поиска, содержащую последовательность, а затем заменил две таблицы, которые вы планируете обрабатывать, с представлениями, использующими таблицу поиска.

0

Вы можете поставить триггер INSERT на Table_A, который выполняет некоторый код, который увеличивает последовательность Table_B. Теперь, каждый раз, когда вы вставляете новую строку в Table_A, она сбрасывает этот триггер.

+0

Не работает, последовательности не являются безопасными для транзакций. Если один запрос терпит неудачу, одна последовательность обновляется, а другая - нет. Вы не можете сделать это с помощью триггера. –

0

Моя первая мысль, видя это, почему вы действительно хотите это сделать? Это пахнет немного испорченным, вроде как молоко, после истечения нескольких дней.

Каков сценарий, который требует, чтобы эти два seq оставались с одинаковым значением?

Игнорирование «это кажется немного странным» чувства я получаю в моем животе вы можете попробовать это:

Put триггер на TABLE_A, что делает это на вставке. --set b seq до значения a.

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

Проблема такого подхода заключается в том, что это предполагает только вставки в TABLE_A изменит значение table_a_seq и ничего еще будет увеличивающиеся table_a_seq. Если вы можете жить с этим, это может сработать по-настоящему хакерски, что я бы не выпустил на производство, если это был мой звонок.

Если вам это действительно нужно, чтобы сделать его более надежным, создайте единый интерфейс для увеличения table_a_seq, такого как функция. И разрешите манипулирование таблицей_a_seq с помощью этой функции. Таким образом, существует один интерфейс для увеличения table_a_seq, и вы также должны поместить select setval('table_b_seq',currval('table_a_seq')); в эту функцию. Таким образом, независимо от того, table_b_seq всегда будет установлен равным table_a_seq. Это означает удаление каких-либо грантов для пользователей в table_a_seq и предоставление им возможности предоставления гранта для новой функции.

0

Просто используйте одну последовательность для обеих таблиц. Вы не можете синхронизировать их, если вы не синхронизируете их снова и снова. Последовательности не являются безопасными для транзакций, они всегда катят вперед, а не назад, даже не с помощью ROLLBACK.

Редактировать: одна последовательность также не будет работать, не дает вам одинакового номера для обеих таблиц. Используйте подзапрос, чтобы получить правильный номер и использовать только одну последовательность для одной таблицы. Другая таблица должна использовать подзапрос.

Смежные вопросы