Files
yunzerwebsiteallinone/go/docs/sql/alter_oa_dailyreport_soft_delete.sql
T
2026-10-21 17:45:50 +08:00

45 lines
2.1 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================
-- 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';