-- ============================================================= -- OA工作日报:删除改为软删除(已建表环境执行) -- -- 背景:原设计为物理删除(日报被删时同步删除评论),现改为软删除。 -- 日报:is_deleted=0 未删除;删除时写入记录 ID 作为删除批次标记。 -- 评论:is_deleted=0 未删除;删除时置 1。 -- -- 为什么唯一键要加 is_deleted: -- 原唯一键 (tid, user_id, report_date) 会让「删除后同一天重新填写」与 -- 历史软删记录冲突。把 is_deleted 加入唯一键后,删除时写入记录 ID -- (每条记录 ID 唯一),同一天可反复「填写→删除→重新填写」。 -- -- 适用:已执行过 create_oa_dailyreport.sql 的环境; -- 新库直接执行 create_oa_dailyreport.sql 即为软删除结构,无需本脚本。 -- 幂等:重复执行安全。 -- ============================================================= USE `go-platform`; -- 1) is_deleted 扩为 BIGINT UNSIGNED,用于存放删除批次(记录 ID)。MODIFY 幂等。 ALTER TABLE `yz_backend_oa_daily_report` MODIFY COLUMN `is_deleted` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除;删除时写入记录ID(避免唯一键冲突)'; -- 2) 唯一键加入 is_deleted(先判断当前索引列,避免重复执行报 1091) SET @idx_cols := ( SELECT GROUP_CONCAT(`COLUMN_NAME` ORDER BY `SEQ_IN_INDEX`) FROM `information_schema`.`STATISTICS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'yz_backend_oa_daily_report' AND `INDEX_NAME` = 'uk_tid_user_date' ); SET @ddl := IF( @idx_cols = 'tid,user_id,report_date,is_deleted', 'SELECT ''uk_tid_user_date 已包含 is_deleted,跳过'' AS msg', 'ALTER TABLE `yz_backend_oa_daily_report` DROP INDEX `uk_tid_user_date`, ADD UNIQUE KEY `uk_tid_user_date` (`tid`, `user_id`, `report_date`, `is_deleted`)' ); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 3) 核对结果 SHOW INDEX FROM `yz_backend_oa_daily_report` WHERE `Key_name` = 'uk_tid_user_date'; SHOW FULL COLUMNS FROM `yz_backend_oa_daily_report` WHERE `Field` = 'is_deleted';