Последовательности Postgresql - PullRequest
6 голосов
/ 12 января 2011

Когда я удаляю все записи из таблицы Postgresql и затем пытаюсь сбросить последовательность, чтобы начать новую запись с номером 1, когда она вставляется, я получаю разные результаты:

SELECT setval('tblname_id_seq', (SELECT COALESCE(MAX(id),1) FROM tblname));

Это устанавливает текущее значение последовательности равным 1, но СЛЕДУЮЩАЯ запись (фактически первая, потому что еще нет записей) получает номер 2!

И я не могу установить его в 0, потому что минимальное значение в последовательности равно 1!

Когда я использую:

ALTER SEQUENCE tblname_id_seq RESTART WITH 1;

первая вставленная запись фактически получает номер 1! Но приведенный выше код не принимает SELECT в качестве значения вместо 1.

Я хочу сбросить последовательность на номер 1, когда нет записей, и первая запись должна начинаться с 1. Но когда в таблице уже есть записи, я хочу сбросить последовательность так, чтобы следующая запись, вставлено, получит {наивысший} + 1

У кого-нибудь есть четкое решение для этого?

Ответы [ 2 ]

10 голосов
/ 12 января 2011

Используйте форму с тремя аргументами setval, чтобы установить для флага is_called значение false, чтобы он возвращал текущее значение последовательности для следующего вызова nextval вместо немедленной генерации нового.

http://www.postgresql.org/docs/current/interactive/functions-sequence.html

Также обратите внимание, что вам нужно использовать COALESCE(MAX(id),0)+1, в противном случае первое значение из последовательности будет MAX(id), которое, как вы знаете, уже существует. (спасибо Стивену Денну)

2 голосов
/ 12 января 2011

См. http://www.postgresql.org/docs/current/static/functions-sequence.html, в нижней части страницы.

В частности, по крайней мере в Postgresql 9.0 вы можете найти и установить значение последовательности.Вы можете использовать форму с тремя аргументами setval(), чтобы установить либо текущее значение последовательности, либо значение next последовательности (что позволит вам установить последовательность в 1 при следующем извлечении значения).

...