Requirements changed. A feature demanded new data. Queries started breaking. You needed a new column in production, and you needed it fast.
Adding a new column in a live database is not a cosmetic change. It alters the table definition, impacts query plans, and can affect indexes. In SQL, the syntax is simple:
ALTER TABLE orders ADD COLUMN discount_rate DECIMAL(5,2) DEFAULT 0;
But the real work starts before you run it. You assess migration time. You check for locks on large tables. In PostgreSQL, adding a column with a default value can rewrite the whole table unless you use DEFAULT NULL and backfill in stages. In MySQL, the cost depends on table size and storage engine.
Schema evolution without downtime is an art. Use feature flags to hide incomplete fields. Deploy the column with NULL defaults, backfill rows in batches, then update the NOT NULL constraint. Monitor latency and replication lag.