Setzen Sie den automatischen Inkrementzähler in Postgres zurück


232

Ich möchte das Auto-Inkrement-Feld einer Tabelle auf einen bestimmten Wert erzwingen. Ich habe Folgendes versucht:

ALTER TABLE product AUTO_INCREMENT = 1453

UND

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

Ich bin neu bei postgres :(

Ich habe einen Tisch productmit Idund nameFeld


5
Wenn neu, warum nicht pgAdmin verwenden und die generierten Befehle überprüfen?
Unvernunft

1
Normalerweise werden Tabellen wie "Produkte" und nicht wie "Produkt" benannt. In diesem Fall wird Ihre Sequenz wie "products_id_seq" benannt. Stellen Sie sicher, dass Sie nach einer korrekten Sequenz suchen.
Alexander Gorg

Antworten:


309

Wenn Sie die Tabelle productmit einer idSpalte erstellt haben, wird die Sequenz nicht einfach aufgerufen product, sondern product_id_seq(dh ${table}_${column}_seq).

Dies ist der ALTER SEQUENCEBefehl, den Sie benötigen:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Sie können die Sequenzen in Ihrer Datenbank mit dem \dsBefehl in psql anzeigen. Wenn Sie \d productsich die Standardeinschränkung für Ihre Spalte ansehen, gibt der nextval(...)Aufruf auch den Sequenznamen an.


66
Aus dieser Meldung geht nicht hervor, wie die richtige Syntax lautet. Es ist: ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Liron Yahdav

7
Nur weil ich das Obige schlecht analysiert habe, ist hier meine Art, genau dasselbe zu wiederholen. Die Syntax lautet ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #: "seq" ist der Literaltext, und Sie geben eine Zahl für # ein. Vernachlässigen Sie nicht die Unterstriche. :-)
kmort

2
Bitte beachten Sie, dass bei Nichtverwendung des öffentlichen Schemas my_schema vorangestellt werden muss. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch

Weiß jemand, warum ALTER SEQUENCE product_id_seq RESTART WITH (SELECT MAX (id) from product); Funktioniert nicht Die einzige Möglichkeit, die ich gefunden habe, besteht darin, zwei separate Abfragen zu verwenden.
Chris Huang-Leaver

8
Beachten Sie, dass der Wert, mit dem Sie neu starten, der nächste Wert ist, den Sie verwenden möchten. Wenn Sie also bereits einen Datensatz mit ID haben 1453, sollten Sie dies tun RESTART WITH 1454.
Hughes

144

Hier ist der Befehl, nach dem Sie suchen, vorausgesetzt, Ihre Sequenz für die Produkttabelle lautet product_id_seq:

ALTER SEQUENCE product_id_seq NEUSTART MIT 1453;


130

Der folgende Befehl erledigt dies automatisch für Sie: Dadurch werden auch alle Daten in der Tabelle gelöscht. Also sei vorsichtig.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Achtung - dies wird auch alle Ihre Daten löschen
Kibibu

28
@Loolooii, nur markieren; Wenn jemand, der mit SQL nicht vertraut ist, hier sucht, weil er einer Tabelle mit einem Feld für die automatische Inkrementierung manuell eine Zeile hinzugefügt hat (z. B. über ein ORM), entspricht diese Lösung wahrscheinlich nicht den Erwartungen.
Kibibu

1
Das TABLESchlüsselwort ist redundant. TRUNCATE someTable RESTART IDENTITY;reicht.
Benutzer1

Irgendeine Idee, wie ich das mit CASCADE machen würde?
Ihossain

2
@ihossain hast du es versucht TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran

55

So stellen Sie den Sequenzzähler ein:

setval('product_id_seq', 1453);

Wenn Sie den Sequenznamen nicht kennen, verwenden Sie die pg_get_serial_sequenceFunktion:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

Die Parameter sind der Tabellenname und der Spaltenname.

Oder geben Sie einfach \d productan der psqlEingabeaufforderung ein:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

13

Aus Gründen der Benutzerfreundlichkeit aus dem Kommentar konvertiert

Aus dieser Meldung geht nicht hervor, wie die richtige Syntax lautet. Es ist:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

13

- Ändern Sie den Startwert der Sequenz

ALTER SEQUENCE project_id_seq RESTART 3000;

Gleich aber dynamisch:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

Ich bin damit einverstanden, dass die Verwendung eines SELECT störend ist, aber es funktioniert.

Quelle: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Wenn ich mich nicht irre, repräsentiert PG ihre Sequenzen mit last_value und is_called, beginnt bei (1, false), dann bei (1, true), (2, true) ... also sollte MAX (id) + 1 MAX sein (id) stattdessen keine ID überspringen.
Zehn

Ich musste auch meine Postgres-Instanz neu starten, damit dies funktioniert. brew services restart postgresql
BigRon

SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 FROM project)); Funktioniert einwandfrei Aber gibt es eine Möglichkeit, den Inkrementwert auf 0 zurückzusetzen? Die neuen Einträge beginnen also mit einem 0-Index?
Charith Jayasanka

6

Wenn Sie das automatische Inkrementieren über die GUI zurücksetzen möchten, führen Sie die folgenden Schritte aus.

  1. Gehen Sie zu Ihrer Datenbank
  2. Klicken Sie auf Öffentlich
  3. Auf der Seite mit der Liste der Tabellen sehen Sie TABS wie "Tabellen", "Ansichten", "Sequenzen".
  4. Klicken Sie auf Sequenzen
  5. Wenn Sie auf "Sequenzen" klicken, wird die gesamte Sequenzliste angezeigt. Klicken Sie auf eine der Sequenzen, die Sie zurücksetzen möchten
  6. Danach sehen Sie Multiple-Choice-Optionen wie "Ändern", "Wert einstellen", "Neustart", "Zurücksetzen" usw.
  7. Klicken Sie dann auf Zurücksetzen und fügen Sie eine neue Zeile hinzu.

6

Wenn Sie eine Tabelle mit einer IDENTITY-Spalte haben, für die Sie den nächsten Wert zurücksetzen möchten, können Sie den folgenden Befehl verwenden:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
Eins + für die Benutzerfreundlichkeit, falls es keine gibt sequenceoder Sie die Tabelle NICHT abschneiden können. Ich denke, es ist die beste Antwort
ABS

5

Um das automatische Inkrement zurückzusetzen, müssen Sie Ihren Sequenznamen mithilfe der folgenden Abfrage ermitteln.

Syntax:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Beispiel:

SELECT pg_get_serial_sequence('demo', 'autoid');

Die Abfrage gibt den Sequenznamen von autoid als "Demo_autoid_seq" zurück. Verwenden Sie dann die folgende Abfrage, um das autoid zurückzusetzen

Syntax:

ALTER SEQUENCE sequenceName RESTART WITH value;

Beispiel:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Um die Sequenz-ID zu erhalten, verwenden Sie

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

Dadurch erhalten Sie eine Sequenz-ID als tableName_ColumnName_seq

Um die letzte Startnummer zu erhalten, verwenden Sie

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

oder wenn Sie wissen, dass die Sequenz-ID bereits direkt verwendet wird.

select currval(tableName_ColumnName_seq);

Es gibt Ihnen die letzte Startnummer

Verwenden Sie zum Zurücksetzen der Startnummer

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Verwenden Sie diese Abfrage, um zu überprüfen, was der Sequenzschlüssel mit Schema und Tabelle ist.

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Verwenden Sie diese Abfrage, um den Inkrementwert nacheinander zu erhöhen.

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

Beim Einfügen in die Tabelle wird der nächste inkrementierte Wert als Schlüssel (111) verwendet.

Verwenden Sie diese Abfrage, um einen bestimmten Wert als inkrementierten Wert festzulegen

SELECT setval('"SchemaName"."SequenceKey"', 120);

Beim Einfügen in die Tabelle wird der nächste inkrementierte Wert als Schlüssel verwendet (121).


0

Beachten Sie, dass der Tabellenname mit '_' im Sequenznamen entfernt wird.

Beispiel: Tabellenname: user_tokens Spalte: id Sequenzname: usertokens_id_seq

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.