Сбросить первичный ключ PostgreSQL на 1

82

Есть ли способ сбросить первичный ключ таблицы PostgreSQL, чтобы снова начать с 1 в заполненной таблице?

Сейчас он генерирует числа от 1000000 и выше. Я хочу, чтобы все было сброшено и началось с 1, сохранив все мои существующие данные нетронутыми.

Дэвид
источник

Ответы:

34

См. Лучший вариант здесь: https://stackoverflow.com/a/5272164/5190

Первичные ключи с автоинкрементом (т. Е. Столбцы с типом данных serial primary key) связаны с последовательностью . Вы можете установить следующее значение для любой последовательности с помощью setval(<seqname>, <next_value>)функции. Обратите внимание, что для фактического выполнения функции вам нужно использовать SELECT, например:SELECT setval(<seqname>, <next_value>)

Имя автоматически созданных последовательностей при использовании серийного номера: <table>_<column>_seq

Винко Врсалович
источник
14
Вам нужно поставить «ВЫБРАТЬ» перед вызовом, например,SELECT setval('table_id_seq', 10000)
Том
4
Если да SELECT setval('table_id_seq', 1), то при вставке новой записи id принимает значение 2 вместо 1. Решение Paweł Gościcki работает. (PostgreSQL 9.3)
голубоватый
@bluish Предположительно произошло то, что порядковый номер увеличился до назначения нового первичного ключа, т.е. вам нужно будет сбросить его до 0. Но я согласен, что другое решение в любом случае лучше.
kralyk 06
189

Лучший способ сбросить последовательность, чтобы начать с номера 1, - выполнить следующее:

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

Так, например, для usersтаблицы это будет:

ALTER SEQUENCE users_id_seq RESTART WITH 1
Павел Госьцицкий
источник
21
WITH 1Параметр redundand и он может быть опущен
Яцек Кравчик
Это единственный правильный ответ, поскольку он действительно сбрасывает последовательность.
Balbinator 06
1
Большая проблема на индексах сгенерированных автоматически CREATE TABLE условие, что мы не знаем , имя (и суффикс не было seq, не может и pkт.д.) . ... Но это легко, на PSQL по \d my_table_name. Или проверьте с помощью SQL,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
Питер Краусс,
3

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

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)

Итак, если вы хотите, чтобы первый идентификатор был равен 1, вам следует установить для своей последовательности значение 0. Но это выходит за рамки, поэтому вы должны использовать оператор ALTER SEQUECE. Итак, если у вас есть серийное поле с именем number в меню таблицы, например:

ALTER SEQUENCE menu_number_seq RESTART

сделает работу отлично.

Рокфор Франсуа
источник