20260531_s8_notification_log_indexes_rollback.sql 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. -- S8-NOTIFICATION-LOG-INDEX-DDL-P2-3 — ROLLBACK
  2. -- Target table: ado_s8_notification_log
  3. -- Purpose: 回滚 20260531_s8_notification_log_indexes.sql 创建的 2 个二级索引。
  4. --
  5. -- 重要前置:
  6. -- 1. 如果 AdoS8NotificationLog.cs 实体上的 [SugarIndex] 注解仍然存在,
  7. -- 下一次 Database.json 的 TableSettings.EnableInitTable=true 启动时,
  8. -- CodeFirst 会按注解自动重建本脚本刚 DROP 的索引;
  9. -- 2. 因此回滚 DDL 时,必须同步执行以下任一动作:
  10. -- - 同步移除 AdoS8NotificationLog.cs 中对应的 [SugarIndex] 注解,或
  11. -- - 在回滚期间将 Database.json 中 TableSettings.EnableInitTable 改为 false,
  12. -- 否则回滚将被 CodeFirst 自动覆盖。
  13. -- 3. 本脚本仅 DROP 二级索引,不删除任何数据行,不改字段,不改表结构,
  14. -- 不触碰其他索引(PRIMARY 与未来新增索引不受影响)。
  15. -- 4. 不执行 DML(INSERT/UPDATE/DELETE)。
  16. -- 5. 不执行 DROP TABLE / TRUNCATE / ALTER COLUMN / MODIFY COLUMN。
  17. --
  18. -- Idempotency:
  19. -- MySQL 8 不支持 DROP INDEX IF EXISTS(仅 8.0.29+ 支持,且本环境未验证)。
  20. -- 如果索引已不存在,DROP 会抛 "Can't DROP ... ; check that column/key exists",
  21. -- 属安全错误,先跑 pre-check 可避免。
  22. -- =========================================================================
  23. -- Pre-check (run first; expect 1 row each when index present)
  24. -- =========================================================================
  25. -- Pre-check A: idx_s8_notif_channel_time
  26. SELECT COUNT(*) AS exists_channel_time
  27. FROM INFORMATION_SCHEMA.STATISTICS
  28. WHERE TABLE_SCHEMA = DATABASE()
  29. AND TABLE_NAME = 'ado_s8_notification_log'
  30. AND INDEX_NAME = 'idx_s8_notif_channel_time';
  31. -- Pre-check B: idx_s8_notif_created_at
  32. SELECT COUNT(*) AS exists_created_at
  33. FROM INFORMATION_SCHEMA.STATISTICS
  34. WHERE TABLE_SCHEMA = DATABASE()
  35. AND TABLE_NAME = 'ado_s8_notification_log'
  36. AND INDEX_NAME = 'idx_s8_notif_created_at';
  37. -- =========================================================================
  38. -- Index drop (run each only when its pre-check returned 1)
  39. -- =========================================================================
  40. -- Drop index A
  41. DROP INDEX idx_s8_notif_channel_time ON ado_s8_notification_log;
  42. -- Drop index B
  43. DROP INDEX idx_s8_notif_created_at ON ado_s8_notification_log;
  44. -- =========================================================================
  45. -- Post-check (run after drop; expect 0 rows total)
  46. -- =========================================================================
  47. SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
  48. FROM INFORMATION_SCHEMA.STATISTICS
  49. WHERE TABLE_SCHEMA = DATABASE()
  50. AND TABLE_NAME = 'ado_s8_notification_log'
  51. AND INDEX_NAME IN (
  52. 'idx_s8_notif_channel_time',
  53. 'idx_s8_notif_created_at'
  54. )
  55. GROUP BY INDEX_NAME;