UPDATE 语句最简可用形式
直接修改单表数据,必须带
WHERE条件,否则整张表都会被更新——这是新手最常踩的坑。
基本写法是:
UPDATE <code>table_name</code> SET <code>column1</code> = <code>value1</code>, <code>column2</code> = <code>value2</code> WHERE <code>condition</code>;
SET后面可以跟多个列赋值,用逗号分隔
WHERE条件不写或写成
WHERE 1/
WHERE TRUE,会导致全表更新,生产环境严禁出现 如果只改一个字段,
SET后仍需写完整赋值表达式,不能省略
=
UPDATE 多表关联更新的两种写法
MySQL 支持一次更新多个表,但语法和标准 SQL 不同,容易混淆。
常见写法有两种:
UPDATE <code>t1</code>, <code>t2</code> SET <code>t1.col</code> = <code>t2.col</code> WHERE <code>t1.id</code> = <code>t2.t1_id</code>;
或显式用
JOIN:
UPDATE <code>t1</code> JOIN <code>t2</code> ON <code>t1.id</code> = <code>t2.t1_id</code> SET <code>t1.col</code> = <code>t2.col</code>;多表 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 条件是否真的能命中预期数据、字段类型是否允许目标值、以及有没有被外键或触发器暗中拦截。这些都不是语法错误,却会让更新“静默失效”。
