Postgres вручную изменить последовательность - PullRequest
133 голосов
/ 05 января 2012

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

SELECT setval('payments_id_seq'), 21, true

Это выдает ошибку:

ERROR: function setval(unknown) does not exist

Использование ALTER SEQUENCE тоже не работает?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

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

Ссылка: https://www.postgresql.org/docs/current/static/functions-sequence.html

Ответы [ 4 ]

164 голосов
/ 05 января 2012

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

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

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

149 голосов
/ 06 января 2012

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

<strike>ALTER SEQUENCE payments_id_seq LASTVALUE 22</strike>

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

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

и эквивалентно:

* * 1010

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

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

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 или новее.

18 голосов
/ 26 марта 2018

Использование 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 таблицы

8 голосов
/ 05 января 2012
setval('sequence_name', sequence_value)
...