Postgres вручную изменить последовательность

Я пытаюсь установить последовательность определенное значение.

SELECT setval('payments_id_seq'), 21, true

это дает ошибку:

ERROR: function setval(unknown) does not exist

используя ALTER SEQUENCE не работает?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

как это можно сделать?

Ref:https://www.postgresql.org/docs/current/static/functions-sequence.html

4 ответов


скобки неуместны:

setval('payments_id_seq', 21, true)

в противном случае вы звоните setval С одним аргументом, в то время как для этого требуется два или три.


этот синтаксис недопустим в любой версия PostgreSQL:

ALTER SEQUENCE payments_id_seq LASTVALUE 22

это будет работать:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

и составляет:

SELECT setval('payments_id_seq', 22, FALSE);

больше настоящее руководство ALTER SEQUENCE и функции последовательность.

отметим, что setval() ожидает либо (regclass, bigint) или (regclass, bigint, boolean). В приведенном выше примере я предоставляю нетипизированный литералы. Это тоже работает. Но если вы вводите типизированные переменные в функцию, которая вам может понадобиться explicit тип забросы удовлетворять тип разрешение функции. Например:

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

для повторных операций вас может заинтересовать:

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH] сохраняет значение по умолчанию RESTART номер, который используется для последующих RESTART звонки без значения. Вам нужно и Postgres 8.4 или более поздней версии для последней части.


setval('sequence_name', sequence_value)

использовать select setval('payments_id_seq', 21, true);

setval содержит 3 параметра:

  • 1-й параметр sequence_name
  • 2-й параметр является следующим nextval
  • 3-й параметр является необязательным.

использование true или false в 3-м параметре setval выглядит следующим образом:

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

лучший способ избежать жесткого кодирования имени последовательности, следующего значения последовательности и правильно обрабатывать пустую таблицу столбцов, вы можете использовать следующее путь:

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

здесь table_name это название таблицы,id - это primary key таблицы