W PostgreSQL nie ma takiego mechanizmu.
Nadal jednak można uniknąć nadmiernych skutków takiej zmiany tabeli.
Następująca instrukcja nabywa blokadę dostępu na wyłączność dla tabeli na czas trwania wyciągu / transakcji:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Ta instrukcja zmienia katalog, a następnie przepisuje całą tabelę, tak aby nowa kolumna zawierała wartość domyślną we wszystkich wierszach. Jeśli tabela ma wiele wierszy i jest dostępna często, może to spowodować przejściowe problemy.
Aby tego uniknąć, spróbuj przytrzymać wyłączną blokadę tak krótko, jak to możliwe:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Ponieważ jest to w zasadzie tylko (właściwie dwie) zmiana katalogu (nie następuje zmiana danych), zostanie ona wykonana dość szybko. Następnie, w zależności od potrzeb i użycia tabeli, możesz zaktualizować nową kolumnę do domyślnej w jednym kroku lub partiach, a po zakończeniu ustaw kolumnę na NOT NULL
.
Aktualizacja o spełnieniu się życzenia: PostgreSQL 11 będzie miał tę funkcję. Zobacz https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/, aby uzyskać więcej.