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 или более поздней версии для последней части.
использовать 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
таблицы