Чи є спосіб скинути первинний ключ таблиці 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)
, коли я вставляю новий запис, ідентифікатор приймає значення 2, а не 1. Рішення Павла Гощицького працює. (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. Отже, якщо у вашому меню таблиці є серійне поле з назвою номер, для прикладу:
ALTER SEQUENCE menu_number_seq RESTART
зробить роботу ідеально.
SELECT setval('table_id_seq', 10000)