gongxiangp2/docs/migration-safety-analysis.md

3.6 KiB
Raw Blame History

数据库迁移安全性分析

✅ 迁移操作完全安全,不会影响现有素材

迁移文件分析: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 表完全独立
添加外键 ❌ 不影响 外键只是约束,不修改数据

✅ 安全保障措施

  1. 所有操作都使用 IF NOT EXISTS:确保可以安全重复执行
  2. 只添加,不删除:没有任何 DROP、DELETE、TRUNCATE 操作
  3. 不修改现有字段:没有 ALTER COLUMN 修改数据类型或约束
  4. 向后兼容:现有代码可以正常工作,新字段为 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 确保可以安全重复执行
  • ✅ 现有素材数据完全不受影响