Сбросить первичный ключ 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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.