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?
quelle
Es ist ein Fehler, wie @Evan herausgefunden hat. Bis er behoben ist, müssen wir ihn umgehen.
Wie Sie wahrscheinlich wissen, ist es einfach, den Fall für mehrere Spalteneinfügungen zu umgehen, bei denen nicht alle Werte vorhanden sind.
default
Lassen Sie einfach die Spalte (n) weg, in die derdefault
Wert vollständig eingefügt werden soll. Diesdefault
ist die Standardeinstellung :dbfiddle hier
Wenn mehrere Spalten vorhanden sind und alle standardmäßig sein sollen, können Sie weiterhin einen CTE verwenden :
dbfiddle hier
Leider gibt es keine einfache Problemumgehung, wenn alle Spalten gefüllt werden müssen mit
default
:quelle