A single missing field can stop a release. Adding a new column should be fast, atomic, and safe. Yet in many teams it’s a risk point—races with production traffic, schema drift between environments, and rollback headaches.
A new column in a relational database changes the contract your code depends on. You must define the schema, pick the data type, set defaults, and decide on nullability. In production, the choice between nullable and not-null with default impacts lock times, storage, and I/O. On large tables, a blocking migration can stall requests.
The best approach is to break the change into steps. First, deploy the new column in a non-blocking way, without default or constraint. Second, backfill in controlled batches to avoid load spikes. Third, apply the constraint only after the data is consistent and verified. This sequence works in Postgres, MySQL, and most other SQL engines.