Setzen Sie den PostgreSQL-Primärschlüssel auf 1 zurück

80

Gibt es eine Möglichkeit, den Primärschlüssel einer PostgreSQL-Tabelle zurückzusetzen, um in einer aufgefüllten Tabelle erneut bei 1 zu beginnen?

Im Moment werden Zahlen ab 1000000 generiert. Ich möchte, dass alles zurückgesetzt wird und auf 1 beginnt, wobei alle meine vorhandenen Daten intakt bleiben.

David
quelle

Antworten:

34

Primärschlüssel, die automatisch inkrementiert werden (dh Spalten mit Datentyp serial primary key), sind einer Sequenz zugeordnet . Mit der setval(<seqname>, <next_value>)Funktion können Sie den nächsten Wert für jede Sequenz einstellen . Beachten Sie, dass Sie Folgendes verwenden müssen SELECT, um die Funktion selbst auszuführen :SELECT setval(<seqname>, <next_value>)

Der Name der automatisch erstellten Sequenzen bei Verwendung von serial ist <table>_<column>_seq

Vinko Vrsalovic
quelle
14
Sie müssen "SELECT" vor den Anruf stellen, z. B.SELECT setval('table_id_seq', 10000)
Tom
3
Wenn ich dies tue SELECT setval('table_id_seq', 1), nimmt die ID beim Einfügen eines neuen Datensatzes den Wert 2 anstelle von 1 an. Die Lösung von Paweł Gościcki funktioniert. (PostgreSQL 9.3)
bläulich
@bluish Vermutlich wurde die Sequenznummer erhöht, bevor ein neuer Primärschlüssel zugewiesen wird, d. h. Sie müssten es auf 0 zurücksetzen. Aber ich stimme zu, dass die andere Lösung sowieso besser ist.
Kralyk
184

Der beste Weg, eine Sequenz zurückzusetzen, um mit Nummer 1 zu beginnen, besteht darin, Folgendes auszuführen:

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

So userswäre es zum Beispiel für die Tabelle:

ALTER SEQUENCE users_id_seq RESTART WITH 1
Paweł Gościcki
quelle
21
Der WITH 1Parameter ist redundant und kann weggelassen werden
Jacek Krawczyk
Das ist die einzig richtige Antwort, da sie die Sequenz wirklich zurücksetzt.
Balbinator
1
Das große Problem bei Indizes, die automatisch durch die CREATE TABLE-Klausel generiert werden, ist, dass wir den Namen nicht kennen (und das Suffix nicht seq, kann durch pkusw.) ... Aber es ist einfach durch auf psql durch \d my_table_name. Oder überprüfen Sie per SQL,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
Peter Krauss
3

@bluish Das Einfügen eines neuen Datensatzes mithilfe eines automatisch inkrementierten Primärschlüssels entspricht der expliziten Verwendung einer Sequenz auf folgende Weise:

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

Wenn Sie also möchten, dass die erste ID 1 ist, müssen Sie Ihre Sequenz auf 0 setzen. Da sie jedoch außerhalb der Grenzen liegt, müssen Sie die Anweisung ALTER SEQUECE verwenden. Wenn Sie also ein Serienfeld mit dem Namen Nummer in Ihrem Tabellenmenü haben, zum Beispiel:

ALTER SEQUENCE menu_number_seq RESTART

wird den Job perfekt machen.

ROQUEFORT François
quelle