Есть ли способ сбросить первичный ключ таблицы PostgreSQL, чтобы снова начать с 1 в заполненной таблице?
Сейчас он генерирует числа от 1000000 и выше. Я хочу, чтобы все было сброшено и началось с 1, сохранив все мои существующие данные нетронутыми.
Ответы:
См. Лучший вариант здесь: https://stackoverflow.com/a/5272164/5190
Первичные ключи с автоинкрементом (т. Е. Столбцы с типом данных serial primary key
) связаны с последовательностью . Вы можете установить следующее значение для любой последовательности с помощью setval(<seqname>, <next_value>)
функции. Обратите внимание, что для фактического выполнения функции вам нужно использовать SELECT
, например:SELECT setval(<seqname>, <next_value>)
Имя автоматически созданных последовательностей при использовании серийного номера: <table>_<column>_seq
SELECT setval('table_id_seq', 1)
, то при вставке новой записи id принимает значение 2 вместо 1. Решение Paweł Gościcki работает. (PostgreSQL 9.3)
Лучший способ сбросить последовательность, чтобы начать с номера 1, - выполнить следующее:
ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
Так, например, для users
таблицы это будет:
ALTER SEQUENCE users_id_seq RESTART WITH 1
WITH 1
Параметр redundand и он может быть опущен
seq
, не может и pk
т.д.) . ... Но это легко, на PSQL по \d my_table_name
. Или проверьте с помощью SQL,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
@bluish на самом деле вставляет новую запись с использованием автоматически увеличивающегося первичного ключа, точно так же, как использование последовательности явно таким образом:
INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
Итак, если вы хотите, чтобы первый идентификатор был равен 1, вам следует установить для своей последовательности значение 0. Но это выходит за рамки, поэтому вы должны использовать оператор ALTER SEQUECE. Итак, если у вас есть серийное поле с именем number в меню таблицы, например:
ALTER SEQUENCE menu_number_seq RESTART
сделает работу отлично.
SELECT setval('table_id_seq', 10000)