The code stopped working. A query that ran yesterday now fails on a missing column. You check the schema. You open the migration folder. There is no trace of change tracking. It’s a mess you don’t want to repeat.
Adding a new column should be simple. In practice, it often breaks things. A database schema is a contract—code, APIs, and services lean on it. When you add a column in SQL or a migration framework, you are changing the shape of that contract. Without care, you create performance problems, data integrity issues, or silent errors in production.
A new column in PostgreSQL or MySQL is more than a line like:
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;
You need to define the type with precision. You need to handle defaults. You need to decide on NULL vs NOT NULL. You need to update indexes if queries will filter or sort by it. On large datasets, adding columns without downtime strategies can lock tables for minutes—or hours.