wake-up-neo.com

Wie kann ich einer Postgresql-Datenbank eine Spalte hinzufügen, die keine Nullen zulässt?

Ich füge meiner Postgresql-Datenbank eine neue "NOT NULL" -Spalte mit der folgenden Abfrage hinzu (für das Internet bereinigt):

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

Bei jeder Ausführung dieser Abfrage wird folgende Fehlermeldung angezeigt:

ERROR:  column "mycolumn" contains null values

Ich bin ratlos. Wo gehe ich falsch?

ANMERKUNG: Ich verwende hauptsächlich pgAdmin III (1.8.4), habe jedoch den gleichen Fehler erhalten, als ich SQL über Terminal ausgeführt habe.

224
Huuuze

Sie müssen einen Standardwert festlegen.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo';

... some work (set real values as you want)...

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;
365
Luc M

Wie andere beobachtet haben, müssen Sie entweder eine nullfähige Spalte erstellen oder einen DEFAULT-Wert angeben. Wenn dies nicht flexibel genug ist (z. B. wenn der neue Wert für jede Zeile einzeln berechnet werden muss), können Sie die Tatsache nutzen, dass in PostgreSQL alle DDL-Befehle innerhalb einer Transaktion ausgeführt werden können:

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;
70
j_random_hacker

Da die Tabelle bereits Zeilen enthält, wird mit der Anweisung ALTER versucht, NULL für alle vorhandenen Zeilen in die neu erstellte Spalte einzufügen. Sie müssten die Spalte hinzufügen, indem Sie NULL zulassen, dann die Spalte mit den gewünschten Werten füllen und sie anschließend auf NOT NULL Setzen.

48
Sean Bright

Entweder müssen Sie einen Standard definieren, oder Sie müssen das tun, was Sean sagt, und ihn ohne die Null-Einschränkung hinzufügen, bis Sie ihn in die vorhandenen Zeilen eingetragen haben.

5
Paul Tomblin

Das Angeben eines Standardwerts würde auch funktionieren, vorausgesetzt, ein Standardwert ist angemessen.

2
Ryan Graham

Oder erstellen Sie eine neue Tabelle als temporäre Tabelle mit der zusätzlichen Spalte, kopieren Sie die Daten in diese neue Tabelle, während Sie sie nach Bedarf bearbeiten, um die nicht nullfähige neue Spalte zu füllen, und tauschen Sie die Tabelle dann über eine zweistufige Namensänderung aus.

Ja, es ist komplizierter, aber möglicherweise müssen Sie dies auf diese Weise tun, wenn Sie kein großes UPDATE für einen Live-Tisch wünschen.

1
alphadogg

diese Abfrage aktualisiert die Nullen automatisch

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
0
jacktrade