生产数据库批量 UPDATE / DELETE 核心要点-不备份=自行提桶跑路
1. 执行前必做
先 SELECT 预览影响行数
sql
-- 把 UPDATE/DELETE 的 WHERE 条件原封不动拿来 SELECT
SELECT COUNT(*) FROM sys_notify_todo
WHERE fd_app_name = 'OA'
AND fd_create_time < '2026-05-22 22:16:00';
备份目标数据
sql
-- 建备份表
CREATE TABLE sys_notify_todo_bak_20260522 AS
SELECT * FROM sys_notify_todo
WHERE fd_app_name = 'OA'
AND fd_create_time < '2026-05-22 22:16:00';
2. SQL 写法要点
用 CASE WHEN 代替多条 UPDATE
sql
-- ❌ 错误:顺序执行互相覆盖(今天的教训)
UPDATE ... SET fd_module_name = '泛微邮件' WHERE ... = '内部邮件';
UPDATE ... SET fd_module_name = '泛微流程审批' WHERE ... != '内部邮件';
-- ✅ 正确:一条搞定
UPDATE sys_notify_todo
SET fd_module_name = CASE
WHEN fd_module_name = '内部邮件' THEN '泛微邮件'
ELSE '泛微流程审批'
END
WHERE fd_app_name = 'OA'
AND fd_create_time < '2026-05-22 22:16:00';
WHERE 条件必须精准,禁止裸奔
sql
-- ❌ 危险
UPDATE sys_notify_todo SET fd_module_name = '泛微邮件';
-- ✅ 安全
UPDATE sys_notify_todo SET fd_module_name = '泛微邮件'
WHERE fd_id IN ('id1', 'id2', 'id3');
3. 事务保护
sql
BEGIN;
UPDATE sys_notify_todo
SET fd_module_name = '泛微邮件'
WHERE fd_id IN ('id1', 'id2');
-- 先 SELECT 确认结果对不对
SELECT * FROM sys_notify_todo WHERE fd_id IN ('id1', 'id2');
-- 没问题再提交
COMMIT;
-- 有问题立即回滚
ROLLBACK;
4. 执行后验证
sql
-- 更新完马上核对数据是否符合预期
SELECT fd_module_name, COUNT(*) AS cnt
FROM sys_notify_todo
WHERE fd_app_name = 'OA'
AND fd_create_time < '2026-05-22 22:16:00'
GROUP BY fd_module_name;
核心口诀
- 备份先行,导出或建备份表
- SELECT 预览,确认影响行数
- 事务包裹,出错立即 ROLLBACK
- CASE WHEN,多逻辑一条 SQL 搞定
- 执行后验证,SELECT 确认结果