切勿跳过此步骤。一条错误的 `UPDATE` 语句可能对线上数据造成破坏。推荐的安全操作流程如下:
1. 先执行预览查询:`SELECT id, col, REPLACE(col, '旧内容', '新内容') AS preview FROM table WHERE col LIKE '%旧内容%' LIMIT 10;`
2. 人工核对 `preview` 列的结果是否符合预期(需特别注意边界字符、转义及嵌套替换的情况)。
3. 确认无误后,再执行更新:`UPDATE table SET col = REPLACE(col, '旧内容', '新内容') WHERE col LIKE '%旧内容%';`
4. 执行完毕后立即查看影响行数:`SELECT ROW_COUNT();`,并与预估数量进行比对。
如果目标表数据量非常大,建议采用分批更新的策略,例如添加 `AND id BETWEEN 1000 AND 2000` 这样的条件,以避免长时间运行的事务导致系统阻塞。
将内容替换为空字符串时需注意字段值的变化
`REPLACE(col, 'x', '')` 语法是合法的,但需要注意以下两种边界情况:
* 如果字段的整个内容恰好完全由被替换的字符串构成(例如 `col = 'xxx'`,执行 `REPLACE(col, 'x', '')` 后会变成 `''`),结果是空字符串,而非 `NULL` —— 这一点与许多人的直觉相反。
* 但如果字段被定义为 `NOT NULL` 且拥有默认值,而你无意中删除了其全部内容,后续的业务逻辑可能会将空字符串视为异常值进行处理。
* 更危险的情况是:某些 ORM 框架或应用层代码会自动将空字符串转换为 `NULL`,导致数据的实际语义发生意外变更。
因此,当执行替换为空字符串的操作时,最好额外增加条件判断:`UPDATE table SET col = CASE WHEN col = 'xxx' THEN '' ELSE REPLACE(col, 'xxx', '') END WHERE ...`,以明确控制极端情况下的结果。