3.6 KiB
3.6 KiB
数据库迁移安全性分析
✅ 迁移操作完全安全,不会影响现有素材
迁移文件分析:prisma/migrations/20251206000000_add_soft_delete_and_favorites/migration.sql
🔍 详细操作分析
1. 添加 deletedAt 字段(第 2 行)
ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMP(3);
安全性: ✅ 完全安全
- 使用
ADD COLUMN只添加新字段,不会删除或修改任何现有字段 - 使用
IF NOT EXISTS确保字段不存在时才添加,不会重复执行 - 新字段默认值为
NULL,不会影响现有素材数据 - 所有现有素材的
deletedAt字段都是NULL,表示未删除
2. 创建索引(第 5 行)
CREATE INDEX IF NOT EXISTS "materials_deletedAt_idx" ON "materials"("deletedAt");
安全性: ✅ 完全安全
- 索引只是查询优化工具,不修改数据
- 使用
IF NOT EXISTS确保不会重复创建 - 不会影响任何素材数据
3. 创建新表(第 8-15 行)
CREATE TABLE IF NOT EXISTS "material_favorites" (...)
安全性: ✅ 完全安全
- 创建全新的表,与
materials表完全独立 - 使用
IF NOT EXISTS确保不会重复创建 - 不会修改或删除
materials表中的任何数据
4. 创建其他新表(第 46-53, 83-92 行)
material_download_logs表material_logs表 安全性: ✅ 完全安全- 都是全新的表,与
materials表完全独立 - 不会影响
materials表中的任何数据
5. 添加外键约束(第 25-43, 62-80, 100-118 行)
ALTER TABLE "material_favorites" ADD CONSTRAINT ...
FOREIGN KEY ("materialId") REFERENCES "materials"("id") ...
安全性: ✅ 完全安全
- 外键约束只是数据完整性检查,不修改数据
- 使用
IF NOT EXISTS检查确保不会重复添加 - 不会删除或修改
materials表中的任何数据
📊 数据影响总结
| 操作类型 | 是否影响现有素材 | 说明 |
|---|---|---|
| 添加字段 | ❌ 不影响 | 只添加新字段,所有现有素材的 deletedAt 为 NULL |
| 创建索引 | ❌ 不影响 | 索引只是查询优化,不修改数据 |
| 创建新表 | ❌ 不影响 | 新表与 materials 表完全独立 |
| 添加外键 | ❌ 不影响 | 外键只是约束,不修改数据 |
✅ 安全保障措施
- 所有操作都使用
IF NOT EXISTS:确保可以安全重复执行 - 只添加,不删除:没有任何
DROP、DELETE、TRUNCATE操作 - 不修改现有字段:没有
ALTER COLUMN修改数据类型或约束 - 向后兼容:现有代码可以正常工作,新字段为
NULL时不影响查询
🛡️ 回滚方案
如果迁移后出现问题(虽然不太可能),可以安全回滚:
-- 删除新字段(可选,不影响数据)
ALTER TABLE "materials" DROP COLUMN IF EXISTS "deletedAt";
-- 删除新表(可选,不影响 materials 表)
DROP TABLE IF EXISTS "material_favorites";
DROP TABLE IF EXISTS "material_logs";
DROP TABLE IF EXISTS "material_download_logs";
注意: 回滚操作不会影响 materials 表中的任何素材数据。
📝 结论
✅ 本次迁移完全安全,不会影响正式环境中的任何素材数据。
- ✅ 所有操作都是添加操作(添加字段、添加表、添加索引)
- ✅ 没有任何删除或修改操作
- ✅ 使用
IF NOT EXISTS确保可以安全重复执行 - ✅ 现有素材数据完全不受影响