Zresetuj klucz podstawowy PostgreSQL do 1

82

Czy istnieje sposób na zresetowanie klucza podstawowego tabeli PostgreSQL, aby ponownie zaczynał od 1 w tabeli zapełnionej?

W tej chwili generuje liczby od 1000000 wzwyż. Chcę, żeby wszystko się zresetowało i zaczęło do 1, zachowując wszystkie moje istniejące dane nienaruszone.

David
źródło

Odpowiedzi:

34

Zobacz lepszą opcję tutaj: https://stackoverflow.com/a/5272164/5190

Klucze podstawowe, które automatycznie zwiększają (tj. Kolumny z typem danych serial primary key) są skojarzone z sekwencją . Za pomocą setval(<seqname>, <next_value>)funkcji można ustawić następną wartość dla dowolnej sekwencji . Zauważ, że aby faktycznie wykonać tę funkcję samodzielnie, musisz użyć SELECT, na przykład:SELECT setval(<seqname>, <next_value>)

Nazwy automatycznie utworzonych sekwencji podczas korzystania z serialu to <table>_<column>_seq

Vinko Vrsalovic
źródło
14
Musisz wstawić „SELECT” przed wezwaniem, np.SELECT setval('table_id_seq', 10000)
Tomek
4
Jeśli tak SELECT setval('table_id_seq', 1), to po wstawieniu nowego rekordu id przyjmuje wartość 2, zamiast 1. Rozwiązanie Pawła Gościckiego działa. (PostgreSQL 9.3)
niebieskawy
@bluish Przypuszczalnie to, co się stało, to zwiększenie numeru sekwencji przed przypisaniem nowego klucza podstawowego, tj. musiałbyś zresetować go do 0. Ale zgadzam się, że inne rozwiązanie i tak jest lepsze.
kralyk
189

Najlepszym sposobem na zresetowanie sekwencji, aby rozpocząć od numeru 1, jest wykonanie następujących czynności:

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

Na przykład dla userstabeli byłoby to:

ALTER SEQUENCE users_id_seq RESTART WITH 1
Paweł Gościcki
źródło
21
WITH 1Parametr jest redundantnych i może być, pominięte
Jacek Krawczyk
To jedyna prawidłowa odpowiedź, ponieważ naprawdę zresetowała sekwencję.
Balbinator
1
Duży problem na indeksach generowanych automatycznie przez TWORZENIE klauzuli TABLE, jest to, że nie wiemy, nazwę (a przyrostek nie jest seq, można by pketc.) ... Ale to jest łatwe przez na psql przez \d my_table_name. Lub sprawdź przez SQL,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
Peter Krauss
3

@bluish faktycznie wstawiając nowy rekord przy użyciu automatycznie zwiększanego klucza podstawowego, przypomina użycie sekwencji jawnie w ten sposób:

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

Tak więc, jeśli chcesz, aby pierwszy id miał wartość 1, powinieneś ustawić sekwencję na 0. Ale to jest poza granicami, więc musisz użyć instrukcji ALTER SEQUECE. Tak więc, jeśli masz pole seryjne o nazwie numer w menu tabeli, na przykład:

ALTER SEQUENCE menu_number_seq RESTART

doskonale wykonają pracę.

ROQUEFORT François
źródło