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 TABLE
Seite.
Wenn Sie jedoch mehrere Zeilen in eine Tabelle mit einer GENERATED BY DEFAULT AS IDENTITY
Spalte 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 DEFAULT
Schlü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 SERIAL
Spaltenpseudotyps 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 DEFAULT
nicht erwartet, dass das Schlüsselwort mit der neuen Identitätsspalte funktioniert ? Oder ist das ein Fehler?