Ich habe kürzlich ein Upgrade von PostgreSQL 9.5 auf PostgreSQL 10 durchgeführt. Eine der raffinierten Funktionen in PostgreSQL 10 ist der neue Identitätsspaltentyp , eine Alternative zum seriellen Pseudotyp vom PostgreSQL -Typ. Die offizielle Dokumentation zur Identitätsspalte finden Sie auf der CREATE TABLESeite.
Wenn Sie jedoch mehrere Zeilen in eine Tabelle mit einer GENERATED BY DEFAULT AS IDENTITYSpalte einfügen und das Schlüsselwort verwenden DEFAULT, um den nächsten ID-Wert abzurufen, wird der Standardwert als zurückgegeben null.
Nehmen wir zum Beispiel an, ich habe einen Tisch
CREATE TABLE test (
id int GENERATED BY DEFAULT AS IDENTITY,
t text
);
CREATE TABLE
Das Einfügen einer einzelnen Zeile mit dem DEFAULTSchlüsselwort scheint gut zu funktionieren.
INSERT INTO test (id, t) VALUES (DEFAULT, 'a');
INSERT 0 1
Das Einfügen mehrerer Zeilen funktioniert nicht.
INSERT INTO test (id, t) VALUES (DEFAULT, 'b'), (DEFAULT, 'c');
ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, b).
Das Einfügen mehrerer Zeilen mit einem impliziten Standard funktioniert ebenfalls.
INSERT INTO test (t) VALUES ('d'), ('e');
INSERT 0 2
Das oben angegebene Problem scheint bei Verwendung des SERIALSpaltenpseudotyps nicht vorhanden zu sein .
CREATE TABLE test2 (
id SERIAL,
t text
);
CREATE TABLE
INSERT INTO test2 (id, t) VALUES (DEFAULT, 'a'), (DEFAULT, 'b');
INSERT 0 2
Meine Frage ist also: Vermisse ich etwas? Wird DEFAULTnicht erwartet, dass das Schlüsselwort mit der neuen Identitätsspalte funktioniert ? Oder ist das ein Fehler?