update set name = 'xxx' where id = 1 and is_delete = 0 where后面同时用了两个字段id和is_delete,锁表还是锁行?

作者站长头像
站长
· 阅读数 6

**我发现mysql的group by 后面的字段没有严格要求,甚至select后面的字段可以不出现在group by后面**

回复
1个回答
avatar
test
2024-06-26

当然是锁行了,要是筛选出来要更新的行数就只有一行,把整个表锁住代价也太大了,筛选出了哪些行就锁哪些行,这样其他行不会受影响。mysql5.7版本之后默认开启了ONLY_FULL_GROUP_BY策略,即:SELECT语句中的字段必须要么出现在GROUP BY子句中,要么作为聚合函数的参数。这个策略的目的是确保查询结果的准确性和一致性,并避免在查询中使用模糊的或不确定的字段。所以你的说法适用于mysql5.7之前的版本,但是建议你都写上,避免不同的Mysql版本之间同样的语句不同的结果(亲身经历,本地是mysql5.6不加不报错,生产上是mysql5.7报错了)

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容