Hat Postgresql SERIAL anders funktionieren?
Ich habe eine postgres-Tabelle mit einer SERIAL-id.
id (serial) name age
Einfügen geschieht in der Regel aus einer web-Anwendung.
Ich manuell eingefügt, zwei neue Datensätze einstellen die id als max (id)+1****
Nach diesen 2 legen Sie, wenn die web-app fügt 2-Datensatz gibt es duplicate key error.
Nur für 2 Platten. Danach funktioniert alles einwandfrei.
Die Frage ist - Warum hast du nicht meine Anleitung einfügen, erhöhen Sie den serial?
Sind "auto increment" - und serial sind anders?
Was vermisse ich hier? Do MySQL oder andere SQL haben das gleiche Problem?
InformationsquelleAutor der Frage zod | 2013-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim erstellen einer
serial
oderbigserial
Spalte, PostgreSQL eigentlich drei Dinge tut:int
oderbigint
Spalte.nextval()
.Beim EINFÜGEN einen Wert ohne Angabe der
serial
Spalte (oder wenn Sie explizit angebenDEFAULT
als Wert),nextval
aufgerufen wird, auf die Reihenfolge zu:Wenn Sie manuell einen nicht standardmäßigen Wert für die
serial
Spalte, dann die Reihenfolge nicht aktualisiert werden undnextval
können Werte zurückgeben, die Ihrserial
Spalte schon verwendet. Also, wenn Sie tun, diese Art der Sache, müssen Sie manuell beheben die Reihenfolge durch aufrufennextval
odersetval
.Beachten Sie auch, dass Datensätze gelöscht werden können, so dass Lücken in
serial
Spalten sind zu werden erwartet, so dass mitmax(id) + 1
ist nicht eine gute Idee, auch wenn es nicht von concurrency-Probleme.Wenn Sie
serial
oderbigserial
Ihre beste Wette ist, lassen Sie PostgreSQL kümmern sich um die Zuordnung der Werte für Sie und behaupten, Sie sind undurchsichtig zahlen, passiert einfach zu kommen in einer bestimmten Reihenfolge: weisen Sie nicht Sie selbst und gehen Sie nicht davon aus, etwas über Sie andere als Eindeutigkeit. Diese Faustregel gilt für alle Datenbank-IMO.Ich bin mir nicht sicher, wie MySQL
auto_increment
funktioniert mit allen verschiedenen Datenbank-Typen, aber vielleicht das Handbuch helfen.InformationsquelleAutor der Antwort mu is too short
Wenn Sie möchten, legen Sie einen Datensatz in der Tabelle mit
serial
Spalte - nur ommit es aus der Abfrage - es wird automatisch generiert.Oder Sie können das einfügen einer defaul-Wert mit etwas wie:
Dritte option ist malually Werte von der seriellen Sequenz direkt:
InformationsquelleAutor der Antwort Igor Romanchenko
Dieser Ansatz ist völlig falsch und wird nicht funktionieren, in alle Datenbank. Es ist nur für Sie gearbeitet, so weit in MySQL durch schiere Glück.
Wenn zwei verbindungen gleichzeitig ausführen, erhalten Sie die gleiche ID. Es können nur zuverlässig arbeiten, wenn Sie die Tabelle sperren gegen gleichzeitige liest sich so, dass nur eine Verbindung kann immer eine ID zu einem Zeitpunkt.
Es ist auch furchtbar ineffizient.
Dies ist der Grund, warum Sequenzen vorhanden sind, so dass Sie zuverlässig erhalten-IDs in Anwesenheit von gleichzeitigen Kuvertiermaschinen.
Verwenden Sie einfach:
oder:
DEFAULT
ist ein besonderer Ort-Halter, die sagen, die Datenbank zu bekommen, der Standardwert für diese Spalte aus der Tabelle definition. Der Standardwert istnextval('my_table_id_seq')
ist, damit die nächste Sequenz wird der Wert eingefügt bekommen.Da Sie sich Fragen, grundlegende Fragen über Sequenzen, empfehle ich Sie auch berücksichtigen, dass Sequenzen sind nicht gapless. Es ist normal für Sequenzen haben "Löcher", wo die Werte in der Tabelle gehen 1, 3, 4, 5, 9, 10, ... .
InformationsquelleAutor der Antwort Craig Ringer