Il n'y a pas un tel mécanisme dans PostgreSQL.
Cependant, vous pouvez toujours éviter les effets excessifs d'un tel changement de table.
L'instruction suivante acquiert un verrou d'accès exclusif sur la table pour la durée de l'instruction / de la transaction:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Cette instruction modifie le catalogue, puis réécrit la table entière afin que la nouvelle colonne contienne la valeur par défaut dans toutes les lignes. Si la table comporte de nombreuses lignes et est consultée assez fréquemment, cela entraînerait des problèmes temporaires.
Pour l'éviter, essayez de maintenir le verrou exclusif aussi court que possible:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Comme il s'agit essentiellement d'une modification (en fait deux) du catalogue (aucun changement de données ne se produit), il se terminera assez rapidement. Ensuite, en fonction de vos besoins et de l'utilisation de la table, vous pouvez mettre à jour la nouvelle colonne par défaut en une seule étape ou par lots, et lorsque vous avez terminé, définissez la colonne sur NOT NULL
.
Mise à jour sur un souhait devenu réalité: PostgreSQL 11 aura cette fonctionnalité. Voir https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ pour plus.