Скиньте первинний ключ 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" перед дзвінком, наприклад,SELECT setval('table_id_seq', 10000)
Том

4
Якщо я це роблю SELECT setval('table_id_seq', 1), коли я вставляю новий запис, ідентифікатор приймає значення 2, а не 1. Рішення Павла Гощицького працює. (PostgreSQL 9.3)
блакитний

@bluish Імовірно, що трапилось, це послідовний номер збільшується до призначення нового первинного ключа, тобто. Вам потрібно буде скинути його до 0. Але я погоджуюсь, що інше рішення все-таки краще.
кралик

189

Найкращий спосіб скинути послідовність для початку з номером 1 - виконати наступне:

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

Так, наприклад, для usersтаблиці це буде:

ALTER SEQUENCE users_id_seq RESTART WITH 1

21
WITH 1Параметр redundand і він може бути опущений
Яцек Кравчик

Це єдина правильна відповідь, оскільки вона дійсно скидає послідовність.
Balbinator

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. Отже, якщо у вашому меню таблиці є серійне поле з назвою номер, для прикладу:

ALTER SEQUENCE menu_number_seq RESTART

зробить роботу ідеально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.