Zum Beispiel, wenn ich eine Abfrage verwende, die Datensatz-IDs zurückgibt
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Welche Produkte produzieren:
1
2
3
Zeigen diese IDs auf die entsprechenden eingefügten Werte?
1 -> name1
2 -> name2
3 -> name3
postgresql
insert
order-by
postgresql-9.4
Sergey
quelle
quelle
Antworten:
Die Antwort für diesen einfachen Fall lautet Ja . Zeilen werden in der angegebenen Reihenfolge in den
VALUES
Ausdruck eingefügt . Handelt es sich bei Ihrerid
Spalte um einenserial
Typ, werden die Werte aus der zugrunde liegenden Sequenz in dieser Reihenfolge abgerufen.Dies ist jedoch ein Implementierungsdetail und es gibt keine Garantien. Insbesondere wird die Reihenfolge bei komplexeren Abfragen mit
WHERE
Bedingungen oder Verknüpfungen nicht unbedingt beibehalten .Möglicherweise werden auch Lücken oder andere Zeilen gemischt, wenn gleichzeitig Transaktionen in dieselbe Tabelle geschrieben werden. Unwahrscheinlich, aber möglich.
Es gibt keine "natürliche" Reihenfolge in einer Datenbanktabelle. Während die physische Reihenfolge der Zeilen (die in der Systemspalte
ctid
angezeigt wird) der ursprünglich eingefügten Reihenfolge entspricht, kann sich dies jederzeit ändern.UPDATE
,DELETE
,VACUUM
Und andere Befehle können die physische Reihenfolge der Zeilen ändern. Aber die generierten Werte fürid
sind stabil und damit natürlich in keiner Weise verbunden.quelle
serial
Spalt - idealerweise in derselben Transaktion.WHERE
Bedingungen. Ich kann mir zwar keine einfachenWHERE
Bedingungen vorstellen , die die Reihenfolge der Zeilen ändern würden, aber Verknüpfungen können dies auf jeden Fall tun.Erwin Brandstetters Antwort kann in einem bestimmten Fall falsch sein.
Wir haben eine durchgeführt
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
und wir sehen,SELECT ctid,* FROM foo
dass die physische Reihenfolge der Zeilen in der Tabelle nicht genau mit der Einfüge-Reihenfolge übereinstimmt, sondern ein wenig durcheinander zu sein scheint. Beachten Sie, dass unsere Tabelle eine jsonb-Spalte mit stark variabler Datengröße enthält. Das experimentelle Abschneiden der jsonb-Daten während des Einfügens führte dazu, dass die Einfügereihenfolge korrekt war.quelle