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.
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;
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;
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.
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.
Das Angeben eines Standardwerts würde auch funktionieren, vorausgesetzt, ein Standardwert ist angemessen.
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.
diese Abfrage aktualisiert die Nullen automatisch
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;