Я пытаюсь установить последовательность для определенного значения.
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
setval()
есть как минимум два аргумента.Ответы:
Скобки неуместны:
В противном случае вы звоните
setval
с одним аргументом, а для этого нужно два или три.источник
true
означает, что следующим значением будет предоставленное число + 1, в данном случае 22.false
означает, что следующим значением будет предоставленное число, или 21. По умолчанию setval будет вести себя так, как если быtrue
был выбран. Более подробная информация: postgresql.org/docs/9.6/static/functions-sequence.htmlselect setval
синтаксиса вalter sequence
том, что вы можете использовать вложенные запросы в нем, например, дляselect max(id) from payments
.Этот синтаксис недопустим в любой версии PostgreSQL:
Это будет работать:
и эквивалентно:
Подробнее в текущем руководстве
ALTER SEQUENCE
и последовательности функций .Обратите внимание, что
setval()
ожидает либо(regclass, bigint)
или(regclass, bigint, boolean)
. В приведенном выше примере я предоставляю нетипизированные литералы . Это тоже работает. Но если вы передаете типизированные переменные в функцию, вам может потребоваться явное приведение типов, чтобы удовлетворить разрешению типа функции. Подобно:Для повторных операций вас могут заинтересовать:
START [WITH]
хранит номер по умолчаниюRESTART
, который используется для последующихRESTART
вызовов без значения. Для последней части вам нужен Postgres 8.4 или новее.источник
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
не работает, аSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
работает. Я получаю синтаксическую ошибку. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
иначе ваши парни не выстраиваются в очередь.SELECT setval('seq', max(col)) FROM tbl;
См .: stackoverflow.com/a/23390399/939860использование
select setval('payments_id_seq', 21, true);
setval
содержит 3 параметра:sequence_name
nextval
Использование true или false в 3-м параметре setval выглядит следующим образом:
Лучший способ избежать жесткого кодирования имени последовательности, следующего значения последовательности и правильно обрабатывать пустую таблицу столбцов, можно использовать следующий способ:
где
table_name
имя таблицы,id
этоprimary key
таблицыисточник
источник
Я не пытаюсь изменить последовательность с помощью
setval
. Но, используяALTER
меня, выдали, как правильно написать имя последовательности. И это работает только для меня:Проверьте требуемое имя последовательности, используя
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
В моем случае это было
ALTER SEQUENCE public."Services_Id_seq" restart 8;
источник