MySQL这样写UPDATE语句,劝退

更新多字段用逗号,不用AND。

错误示范: sql UPDATE table_name SET owner_code='4 3 2 1 2 ' AND owner_name='李四' WHERE id=1
这会出问题。

正确示范: sql UPDATE table_name SET owner_code='4 3 2 1 2 ', owner_name='李四' WHERE id=1
用逗号就行。

为啥? MySQL把AND当逻辑运算。

结果呢? 第一个字段被赋值0或1
记住:多字段更新用逗号。

SQL踩坑记录-Update多个字段

你这update语句被坑了,就是语法不对。

说白了,多字段更新不能用AND隔开。

上周刚处理一个类似问题。

你那个测试SQL,用逗号就对了。

updateappssetowner='4 3 2 1 2 ',owner_name='李四'whereowner_code='1 3 2 4 5 'andowner_name='张三';
这才是标准写法。

你那个用AND的,MySQL把它当逻辑表达式算。

('4 3 2 1 2 'andowner_name='李四')结果就是false。

false在MySQL里等于0。

所以owner_code被赋值为0。

自己看明白了吗?

MySQL Update Left Join 更新最大值:如何使用子查询从多条数据中获取最大值并更新特定字段?

上周 我那个朋友问的SQL更新问题
确实可以这么搞
用UPDATE+子查询
先说例子
2 02 3 年5 月1 0日 公司那个报表需求
假设student表和score表
student有id和score字段
score有student_id和分数
目标是update student表
把每个student_id对应的最大分数
填到student表的score字段
具体SQL
sql UPDATE student SET score = (SELECT MAX(score) FROM score WHERE score.student_id = student.id)
这个子查询 先筛选出每个student_id的记录 然后MAX(score)取最大值
外层UPDATE 直接把子查询结果赋给student.score
执行过程
子查询通过student_id关联 计算每个学生的最高分
然后批量更新student表
比如
student_id=1 score表有8 0和7 8 子查询取MAX(8 0,7 8 )=8 0 update后student.score=8 0
student_id=2 score表有8 8 和9 8 子查询取MAX(8 8 ,9 8 )=9 8 update后student.score=9 8
注意事项
1 . 子查询必须返回单值 如果没关联上 MAX(score)会返回NULL 那student.score就变成NULL
2 . 可以加COALESCE 比如这样
sql UPDATE student SET score = COALESCE((SELECT MAX(score) FROM score WHERE score.student_id = student.id), 0)
没记录的话默认设为0
3 . 索引很重要 score表的student_id要加索引
否则子查询会慢
扩展场景
如果需要更新多个字段 可以这么写
sql UPDATE students LEFT JOIN ( SELECT student_id, MAX(score) AS max_score FROM score GROUP BY student_id ) sc ON s.id = sc.student_id SET s.score = sc.max_score, s.other_field = xxx
这个JOIN写法更清晰
刚想到另一件事 如果score表数据量特别大 子查询可能还是慢
可以试试CTE(公用表表达式)
sql WITH max_scores AS ( SELECT student_id, MAX(score) AS max_score FROM score GROUP BY student_id ) UPDATE student SET score = ms.max_score FROM max_scores ms WHERE student.id = ms.student_id
效果应该差不多 但可读性更好
算了 你看着办