Postgresql: синхронизировать 2 последовательности - PullRequest
1 голос
/ 25 марта 2010

Есть ли способ синхронизировать 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 ]

1 голос
/ 20 мая 2010

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

0 голосов
/ 26 марта 2010

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

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

Не обращая внимания на "это кажется немного странным" чувство, которое я испытываю в животе, вы можете попробовать это:

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

0 голосов
/ 26 марта 2010

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

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

0 голосов
/ 25 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...