Как безопасно переслать последовательность первичных ключей в PostgreSQL? - PullRequest
0 голосов
/ 18 февраля 2012

Используя PostgreSQL (8.x), мне нужно пропустить блок порядковых номеров автоматически , например, после выдачи 49999, я хочу, чтобы следующий идентификатор был 70000, а не 50000

Чтоэто правильный / самый безопасный способ сделать это?

Примечание: я изначально опубликовал очень похожий вопрос Как безопасно переслать последовательность первичных ключей в Django? но у меня такое чувство, что этодолжно быть сделано на уровне базы данных (проблемы параллелизма) ...

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Мне кажется, я нашел способ:

  • Не используйте SERIAL для первичного ключа, используйте DEFAULT my_next_id ()
  • Следуйте той же логике, что и для «одноуровневой последовательности без промежутков» - http://www.varlena.com/GeneralBits/130.php - my_next_id () выполняет обновление с последующим выбором
  • Вместо того, чтобы просто увеличивать на 1, проверьте, была ли граница пересечена, и если да, увеличьте еще больше
0 голосов
/ 19 февраля 2012

Вы можете использовать триггер, который проверяет фактическое значение последовательности после оператора вставки и заменяет его на требуемое значение.

Я думаю, что этот фрагмент должен выполнить работу

CREATE OR REPLACE FUNCTION change_sequence() RETURNS TRIGGER AS $change_sequence$
DECLARE
  current_value INTEGER;

BEGIN
  current_value := currval('your_sequence');
  IF current_value = 49999 THEN
    setval ('you_sequence', 70000, false);
  END IF;
  RETURN NULL;
END;
$change_sequence$ LANGUAGE plpgsql;

-- DROP TRIGGER check_pkey ON your_table;
CREATE TRIGGER check_pkey
AFTER INSERT ON your_table
EXECUTE PROCEDURE change_sequence();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...