UPDATE最简形式须带WHERE条件,否则全表更新;支持单表及多表关联更新;执行前校验约束、长度、主键、外键及权限;无匹配行不报错,需用ROW_COUNT()判断。

UPDATE 语句最简可用形式
直接修改单表数据,必须带 WHERE 条件,否则整张表都会被更新——这是新手最常踩的坑。
基本写法是:
UPDATEtable_nameSETcolumn1=value1,column2=value2WHEREcondition;
-
SET后面可以跟多个列赋值,用逗号分隔 -
WHERE条件不写或写成WHERE 1/WHERE TRUE,会导致全表更新,生产环境严禁出现 - 如果只改一个字段,
SET后仍需写完整赋值表达式,不能省略=
UPDATE 多表关联更新的两种写法
MySQL 支持一次更新多个表,但语法和标准 SQL 不同,容易混淆。
常见写法有两种:
免费 盛世企业网站管理系统(SnSee)系统完全免费使用,无任何功能模块使用限制,在使用过程中如遇到相关问题可以去官方论坛参与讨论。开源 系统Web代码完全开源,在您使用过程中可以根据自已实际情况加以调整或修改,完全可以满足您的需求。强大且灵活 独创的多语言功能,可以直接在后台自由设定语言版本,其语言版本不限数量,可根据自已需要进行任意设置;系统各模块可在后台自由设置及开启;强大且适用的后台管理支
UPDATEt1,t2SETt1.col=t2.colWHEREt1.id=t2.t1_id;
或显式用 JOIN:
UPDATEt1JOINt2ONt1.id=t2.t1_idSETt1.col=t2.col;
- 多表 UPDATE 中,
SET只能更新FROM或JOIN列表中明确写出的表的字段 - 不能在
SET中引用未出现在UPDATE子句里的表(比如UPDATE t1却在SET里写t3.col) - 如果使用了别名(如
UPDATE t1 AS a),后续所有字段引用都必须用别名,不能混用原表名
UPDATE 执行失败的典型错误与限制
不是所有字段都能随时改,MySQL 会在执行前做几层校验:
- 违反
NOT NULL约束:给NOT NULL字段赋NULL值会报错ERROR 1048 (23000): Column 'xxx' cannot be null - 超出字段长度或精度:比如对
DECIMAL(5,2)赋值1000.001,会截断并警告;若开启严格模式则直接报错 - 主键或唯一键冲突:更新后导致重复值,触发
ERROR 1062 (23000): Duplicate entry 'xxx' for key 'PRIMARY' - 外键约束拒绝:目标值在父表中不存在,报错类似
ERROR 1452 (23000): Cannot add or update a child row - 权限不足:用户没有对应表的
UPDATE权限,报ERROR 1142 (42000): UPDATE command denied to user
影响行数为 0 却不报错?这是正常行为
MySQL 的 UPDATE 默认不会因为没匹配到任何行而报错,而是返回 Rows matched: 0 Changed: 0 —— 这常被误认为“执行失败”,其实是成功执行但无实际变更。
- 可通过
ROW_COUNT()函数检查上一条UPDATE影响的行数 - 想让“没匹配到”也视为异常,需在业务逻辑中显式判断
ROW_COUNT() == 0 - 注意:如果
WHERE条件匹配到行,但新旧值相同(比如SET name = 'abc'而当前值就是'abc'),Changed计数为 0,但Rows matched不为 0
UPDATE 时,最容易忽略的是:WHERE 条件是否真的能命中预期数据、字段类型是否允许目标值、以及有没有被外键或触发器暗中拦截。这些都不是语法错误,却会让更新“静默失效”。









