In PostgreSQL gibt es keinen solchen Mechanismus.
Sie können jedoch die übermäßigen Auswirkungen einer solchen Tabellenänderung vermeiden.
Die folgende Anweisung erhält für die Dauer der Anweisung / Transaktion eine exklusive Zugriffssperre für die Tabelle:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Diese Anweisung ändert den Katalog und schreibt dann die gesamte Tabelle neu, sodass die neue Spalte den Standardwert in allen Zeilen enthält. Wenn die Tabelle viele Zeilen enthält und häufig genug zugegriffen wird, würde dies einige vorübergehende Probleme verursachen.
Um dies zu vermeiden, versuchen Sie, das exklusive Schloss so kurz wie möglich zu halten:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Da dies im Grunde nur eine (tatsächlich zwei) Änderung des Katalogs ist (keine Datenänderung erfolgt), wird er ziemlich schnell abgeschlossen. Abhängig von Ihren Anforderungen und der Verwendung der Tabelle können Sie die neue Spalte in einem Schritt oder in Stapeln auf die Standardeinstellung aktualisieren und anschließend die Spalte auf setzen NOT NULL
.
Update über einen wahr gewordenen Wunsch: PostgreSQL 11 wird diese Funktion haben. Weitere Informationen finden Sie unter https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ .