UPDATE最简形式须带WHERE条件,否则全表更新;支持单表及多表关联更新;执行前校验约束、长度、主键、外键及权限;无匹配行不报错,需用ROW_COUNT()判断。
直接修改单表数据,必须带 WHERE 条件,否则整张表都会被更新——这是新手最常踩的坑。
基本写法是:
UPDATEtable_nameSETcolumn1=value1,column2=value2WHEREcondition;
SET 后面可以跟多个列赋值,用逗号分隔WHERE 条件不写或写成 WHERE 1 / WHERE TRUE,会导致全表更新,生产环境严禁出现SET 后仍需写完整赋值表达式,不能省略 =
MySQL 支持一次更新多个表,但语法和标准 SQL 不同,容易混淆。
常见写法有两种:
UPDATEt1,t2SETt1.col=t2.colWHEREt1.id=t2.t1_id;
或显式用 JOIN:
UPDATEt1JOINt2ONt1.id=t2.t1_idSETt1.col=t2.col;
SET 只能更新 FROM 或 JOIN 列表中明
确写出的表的字段SET 中引用未出现在 UPDATE 子句里的表(比如 UPDATE t1 却在 SET 里写 t3.col)UPDATE t1 AS a),后续所有字段引用都必须用别名,不能混用原表名不是所有字段都能随时改,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
MySQL 的 UPDATE 默认不会因为没匹配到任何行而报错,而是返回 Rows matched: 0 Changed: 0 —— 这常被误认为“执行失败”,其实是成功执行但无实际变更。
ROW_COUNT() 函数检查上一条 UPDATE 影响的行数ROW_COUNT() == 0
WHERE 条件匹配到行,但新旧值相同(比如 SET name = 'abc' 而当前值就是 'abc'),Changed 计数为 0,但 Rows matched 不为 0UPDATE 时,最容易忽略的是:WHERE 条件是否真的能命中预期数据、字段类型是否允许目标值、以及有没有被外键或触发器暗中拦截。这些都不是语法错误,却会让更新“静默失效”。