У PostgreSQL такого механізму немає.
Однак ви все одно можете уникнути надмірних наслідків такої зміни таблиці.
Наступне твердження набуває виключного блоку доступу на таблиці протягом тривалості виписки / транзакції:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Це твердження змінює каталог, після чого переписує всю таблицю, щоб новий стовпець містив значення за замовчуванням у всіх рядках. Якщо таблиця має багато рядків і до неї звертаються досить часто, це може спричинити деякі тимчасові проблеми.
Щоб уникнути цього, спробуйте утримати ексклюзивний замок якомога коротше:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Оскільки це в основному лише (фактично дві) зміни в каталозі (жодна зміна даних не відбувається), вона завершиться досить швидко. Тоді, залежно від ваших потреб та використання таблиці, ви можете оновити новий стовпець до типового значення за один крок або партіями, а по завершенні встановити стовпчик на NOT NULL
.
Оновлення про реалізацію бажання: PostgreSQL 11 матиме цю функцію. Дивіться https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ для отримання додаткової інформації.