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). В приведенном выше примере я предоставляю нетипизированный литералы. Это тоже работает. Но если вы вводите типизированные переменные в функцию, которая может вам понадобиться явный тип забросы для удовлетворения разрешения типа функции. Например: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таблицы
Comments