16人参与 • 2026-04-30 • Mysql
在日常开发中,我们经常会遇到这样一个需求:
将表 a 中的字段
a、b,更新为表 b 中对应的字段值,条件是两张表的id相等。
这个问题看似简单,但在 mysql 中其实有多种实现方式,不同写法在性能、安全性、适用场景上都有差异。本文将系统梳理几种常见写法,并分析它们的优缺点。
update a
join b on a.id = b.id
set
a.a = b.a,
a.b = b.b;👉 绝大多数情况优先使用
update a, b
set
a.a = b.a,
a.b = b.b
where a.id = b.id;
update a
set
a = (select b.a from b where b.id = a.id),
b = (select b.b from b where b.id = a.id);
如果某条 a.id 在表 b 中 不存在匹配:
👉 子查询返回 null
👉 会执行:
a = null, b = null
可能导致数据被“误清空”
update a
set
a = (select b.a from b where b.id = a.id),
b = (select b.b from b where b.id = a.id)
where exists (
select 1 from b where b.id = a.id
);
| 写法 | 是否更新全部行 | 未匹配时行为 | 推荐程度 |
|---|---|---|---|
| join | 否 | 不更新 | ⭐⭐⭐⭐⭐ |
| 多表 update | 否 | 不更新 | ⭐⭐⭐⭐ |
| 子查询 | 是 | 更新为 null | ⭐⭐ |
| 子查询 + exists | 否 | 不更新 | ⭐⭐⭐ |
| id | a |
|---|---|
| 1 | x |
| 2 | y |
| id | a |
|---|---|
| 1 | z |
结果:
| id | a |
|---|---|
| 1 | z |
| 2 | null ❗ |
结果:
| id | a |
|---|---|
| 1 | z |
| 2 | y |
update a join b on a.id = b.id set a.a = b.a, a.b = b.b;
b.id 最好是主键或唯一索引select a.id, a.a, b.a from a join b on a.id = b.id;
避免误更新全表:
where a.id in (....)
这个问题的本质是:跨表更新数据。
虽然 mysql 提供了多种写法,但从稳定性和性能角度来看:
👉 update join 是最推荐的标准解法
同时要特别注意:
⚠️ 子查询写法在未匹配时会写入 null
⚠️ 这是很多线上事故的常见原因
到此这篇关于mysql根据 id 将表 b 的字段更新到表 a的实战教程的文章就介绍到这了,更多相关mysql 字段更新内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论