No existe tal mecanismo en PostgreSQL.
Sin embargo, aún puede evitar los efectos excesivos de dicho cambio de tabla.
La siguiente declaración adquiere un bloqueo de acceso exclusivo en la tabla durante la duración de la declaración / transacción:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Esta declaración cambia el catálogo, luego reescribe toda la tabla para que la nueva columna contenga el valor predeterminado en todas las filas. Si la tabla tiene muchas filas y se accede con suficiente frecuencia, esto podría causar algunos problemas temporales.
Para evitarlo, intente mantener el bloqueo exclusivo lo más corto posible:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Como esto es básicamente solo un cambio (en realidad dos) al catálogo (no ocurre ningún cambio de datos), se completará bastante rápido. Luego, según sus necesidades y el uso de la tabla, puede actualizar la nueva columna a la predeterminada en un solo paso o en lotes, y cuando haya terminado, configure la columna en NOT NULL
.
Actualización sobre un deseo hecho realidad: PostgreSQL 11 tendrá esta característica. Ver https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ para más información.