Ich wechsle von MySQL zu PostgreSQL und habe mich gefragt, wie ich Werte automatisch erhöhen kann. Ich habe in den PostgreSQL-Dokumenten einen Datentyp "serial" gesehen, aber bei der Verwendung (in Version 8.0) treten Syntaxfehler auf.
578
Antworten:
Ja, SERIAL ist die entsprechende Funktion.
SERIAL ist nur ein Makro zum Erstellen einer Tabellenzeit um Sequenzen. Sie können SERIAL nicht in eine vorhandene Spalte ändern.
quelle
"Table"
und"table"
lassen sie dann einfach nicht zitiert und kanonisieren sietable
. Die Konvention ist einfach, niemals Anführungszeichen in Seite zu verwenden. Sie können, wenn Sie möchten, gemischte Fallnamen für das Erscheinungsbild verwenden, benötigen sie jedoch nicht: FunktioniertCREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
wie auchSELECT * FROM foobar
.Sie können jeden anderen ganzzahligen Datentyp verwenden , z
smallint
.Beispiel:
Verwenden Sie lieber Ihren eigenen Datentyp als den seriellen Datentyp des Benutzers .
quelle
CREATE SEQUENCE
festlegte (nach dem Lesen von postgresql.org/docs/8.1/interactive/sql-createsequence.html ). . Ich bin mir jedoch nicht ganz sicher, warum Sie den Besitzer gewechselt haben.Wenn Sie der bereits vorhandenen Tabelle eine Sequenz zur ID hinzufügen möchten, können Sie Folgendes verwenden:
quelle
ALTER COLUMN user_id
?ERROR: syntax error at or near "DEFAULT"
Irgendwelche Vorschläge?Während es sieht aus wie Sequenzen das sind äquivalent zu MySQL auto_increment, gibt es einige feine , aber wichtige Unterschiede:
1. Fehlgeschlagene Abfragen erhöhen die Sequenz / Seriennummer
Die serielle Spalte wird bei fehlgeschlagenen Abfragen erhöht. Dies führt zu einer Fragmentierung von fehlgeschlagenen Abfragen, nicht nur zum Löschen von Zeilen. Führen Sie beispielsweise die folgenden Abfragen in Ihrer PostgreSQL-Datenbank aus:
Sie sollten die folgende Ausgabe erhalten:
Beachten Sie, wie die UID von 1 auf 3 anstatt von 1 auf 2 wechselt.
Dies tritt immer noch auf, wenn Sie Ihre eigene Sequenz manuell erstellen mit:
Wenn Sie testen möchten, wie sich MySQL unterscheidet, führen Sie Folgendes in einer MySQL-Datenbank aus:
Sie sollten ohne Fraging Folgendes erhalten :
2. Das manuelle Festlegen des Werts für die serielle Spalte kann dazu führen, dass zukünftige Abfragen fehlschlagen.
Dies wurde von @trev in einer früheren Antwort hervorgehoben.
Um dies manuell zu simulieren, setzen Sie die UID auf 4, was später "zusammenstößt".
Tabellendaten:
Führen Sie eine weitere Einfügung aus:
Tabellendaten:
Wenn Sie nun eine andere Einfügung ausführen:
Es wird mit der folgenden Fehlermeldung fehlschlagen:
Im Gegensatz dazu wird MySQL dies wie unten gezeigt ordnungsgemäß handhaben:
Fügen Sie nun eine weitere Zeile ein, ohne uid einzustellen
Die Abfrage schlägt nicht fehl, uid springt einfach zu 5:
Die Tests wurden unter MySQL 5.6.33 für Linux (x86_64) und PostgreSQL 9.4.9 durchgeführt
quelle
Ab Postgres 10 werden auch Identitätsspalten gemäß dem SQL-Standard unterstützt:
Erstellt eine Identitätsspalte, die nur überschrieben werden kann, wenn dies ausdrücklich angefordert wird. Das folgende Einfügen schlägt mit einer Spalte fehl, die wie folgt definiert ist
generated always
:Dies kann jedoch außer Kraft gesetzt werden:
Bei Verwendung der Option entspricht
generated by default
dies im Wesentlichen dem Verhalten der vorhandenenserial
Implementierung:Wenn ein Wert manuell angegeben wird, muss die zugrunde liegende Sequenz ebenfalls manuell angepasst werden - genau wie bei einer
serial
Spalte.Eine Identitätsspalte ist standardmäßig kein Primärschlüssel (genau wie eine
serial
Spalte). Sollte dies der Fall sein, muss eine Primärschlüsseleinschränkung manuell definiert werden.quelle
Es tut uns leid, eine alte Frage erneut aufzubereiten, aber dies war die erste Frage / Antwort zum Stapelüberlauf, die bei Google aufgetaucht ist.
In diesem Beitrag (der zuerst bei Google veröffentlicht wurde) wird die Verwendung der aktualisierten Syntax für PostgreSQL 10 beschrieben: https://blog.2ndquadrant.com/postgresql-10-identity-columns/
was zufällig ist:
Ich hoffe, das hilft :)
quelle
GENERATED … AS IDENTITY
Befehle Standard-SQL. Zuerst in SQL: 2003 hinzugefügt , dann in SQL: 2008 geklärt . Siehe Funktionen # T174 & F386 & T178.Sie müssen darauf achten, nicht direkt in Ihr SERIAL- oder Sequenzfeld einzufügen, da sonst das Schreiben fehlschlägt, wenn die Sequenz den eingefügten Wert erreicht:
quelle
Im Kontext der gestellten Frage und als Antwort auf den Kommentar von @ sereja1c werden beim
SERIAL
impliziten Erstellen Sequenzen erstellt.CREATE TABLE
würde implizit eine Sequenzfoo_id_seq
für die serielle Spalte erstellenfoo.id
. Daher istSERIAL
[4 Bytes] für die Benutzerfreundlichkeit gut, es sei denn, Sie benötigen einen bestimmten Datentyp für Ihre ID.quelle
Dieser Weg wird sicher funktionieren, ich hoffe es hilft:
Sie können dies anhand der Details im nächsten Link überprüfen: http://www.postgresqltutorial.com/postgresql-serial/
quelle
Seit PostgreSQL 10
quelle