Manually running ALTER TABLE statements against production is how schemas drift out of sync across environments. Migration tools track schema changes as versioned, ordered files — the database equivalent of Git commits.
-- Up
ALTER TABLE orders ADD COLUMN status ENUM('pending','paid','shipped') DEFAULT 'pending';
CREATE INDEX idx_orders_status ON orders(status);
-- Down
DROP INDEX idx_orders_status ON orders;
ALTER TABLE orders DROP COLUMN status;
What This Buys You
- Every environment (dev, staging, production) can be brought to the exact same schema version
- Schema changes are code-reviewed alongside the application code that depends on them
- Rollback is a defined, tested operation instead of a manual scramble
Tools like Laravel’s migrations, Doctrine Migrations, or framework-agnostic options like Flyway and Liquibase all implement this same core pattern — pick whichever fits your stack, but don’t skip having one at all.