Ich versuche, eine Sequenz auf einen bestimmten Wert festzulegen.
SELECT setval('payments_id_seq'), 21, true
Dies gibt einen Fehler:
ERROR: function setval(unknown) does not exist
Verwenden ALTER SEQUENCE
scheint auch nicht zu funktionieren?
ALTER SEQUENCE payments_id_seq LASTVALUE 22
Wie kann das gemacht werden?
Ref: https://www.postgresql.org/docs/current/static/functions-sequence.html
setval()
mindestens zwei Argumente hat.Antworten:
Die Klammern sind falsch platziert:
Andernfalls rufen Sie
setval
mit einem einzelnen Argument auf, während zwei oder drei erforderlich sind.quelle
true
bedeutet, dass der nächste Wert die angegebene Zahl + 1 ist, in diesem Fall 22.false
bedeutet, dass der nächste Wert die angegebene Zahl ist, oder 21. Standardmäßig verhält sich setval so, als obtrue
ausgewählt wurde. Weitere Details: postgresql.org/docs/9.6/static/functions-sequence.htmlselect setval
Syntax gegenüber Tatsache,alter sequence
dass Sie darin verschachtelte Abfragen verwenden können, z. B. toselect max(id) from payments
.Diese Syntax ist in keiner Version von PostgreSQL gültig :
Das würde funktionieren:
und entspricht:
Mehr im aktuellen Handbuch für
ALTER SEQUENCE
und Sequenzfunktionen .Beachten Sie,
setval()
dass entweder erwartet(regclass, bigint)
oder(regclass, bigint, boolean)
. Im obigen Beispiel stelle ich untypisierte Literale bereit . Das funktioniert auch. Wenn Sie der Funktion jedoch typisierte Variablen zuführen, benötigen Sie möglicherweise explizite Typumwandlungen , um die Auflösung des Funktionstyps zu erfüllen. Mögen:Für wiederholte Operationen könnten Sie interessiert sein an:
START [WITH]
speichert einen StandardRESTART
, die für nachfolgendeRESTART
Anrufe ohne Wert verwendet wird. Für den letzten Teil benötigen Sie Postgres 8.4 oder höher.quelle
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
funktioniert nicht, wohingegenSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
funktioniert. Ich erhalte einen Syntaxfehler. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
sonst richten sich deine Eltern nicht aus.SELECT setval('seq', max(col)) FROM tbl;
Siehe: stackoverflow.com/a/23390399/939860Verwenden
select setval('payments_id_seq', 21, true);
setval
enthält 3 Parameter:sequence_name
nextval
Die Verwendung von true oder false im 3. Parameter von setval ist wie folgt:
Der bessere Weg, um eine harte Codierung des Sequenznamens und des nächsten Sequenzwerts zu vermeiden und die leere Spaltentabelle korrekt zu behandeln, ist der folgende Weg:
wo
table_name
ist der Name der Tabelle,id
dieprimary key
von der Tabellequelle
quelle
Ich versuche nicht, die Reihenfolge über zu ändern
setval
. Aber mit wurdeALTER
mir ausgestellt, wie man den Sequenznamen richtig schreibt. Und das funktioniert nur bei mir:Überprüfen Sie den gewünschten Sequenznamen mit
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
In meinem Fall war es
ALTER SEQUENCE public."Services_Id_seq" restart 8;
quelle