- Never modify existing migrations - create new ones instead
- Test migrations - run on a copy of production data before deploying
- Keep migrations small - one logical change per migration
- Use transactions - wrap DDL in transactions where possible
- Idempotent operations - use
IF NOT EXISTS where applicable
- Review generated SQL - if using ORM to generate, always review the output