首页/数据/SQL 速查/受影响行数:changed 与 matched 的区别
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

受影响行数:changed 与 matched 的区别

确认 DML 实际影响:MySQL 默认返回“发生变化”的行数,开启 CLIENT_FOUND_ROWS 后返回“匹配到”的行数;PostgreSQL 返回处理行数。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
UPDATE t SET status = 'x' WHERE id = 1;
SELECT ROW_COUNT();      -- 值未变化时返回 0(changed 口径)
-- 连接参数 CLIENT_FOUND_ROWS:返回匹配行数(found 口径)

PostgreSQL

PostgreSQL
UPDATE t SET status = 'x' WHERE id = 1;
-- 命令标签:UPDATE 1(匹配并处理的行数,即使值相同)
-- 函数内可用 GET DIAGNOSTICS n = ROW_COUNT;
MySQLchanged:值真的变了才计数;found:匹配即计数(按连接标志)
PostgreSQL命令标签直接给出处理行数
用途幂等脚本用 found 口径判断“数据是否存在”,用 changed 口径判断“是否发生变更”

易错点

  • 把“affected=0”当成“记录不存在”:值相同未变化时也是 0,会误判并触发重复插入
  • 批量脚本用 affected 行数做进度统计时,口径不同会导致进度虚高/虚低,先统一口径

数据来源与参考

  • MySQL 8.0 Reference Manual · UPDATE
  • PostgreSQL Documentation · Command Tags
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌