使用WHERE子句执行MySQL UPDATE时触发主键错误求助
解决MySQL UPDATE语句触发主键错误的问题
我来帮你梳理下这个问题的根源和解决办法:
错误原因分析
你遇到的主键错误,本质是子查询返回了多行结果,而primaryKeyColumn = (子查询)这种写法要求子查询必须仅返回1行数据。当子查询返回多行时,MySQL无法确定要匹配哪一行主键,就会抛出错误。另外还要注意:MySQL默认不允许在UPDATE的WHERE子句中直接引用同一个表的子查询,这也可能是触发错误的隐性原因之一。
针对性解决办法
情况1:你确认子查询应该只返回1行数据
- 限制子查询行数:给子查询加上
LIMIT 1,确保只返回一行,修改后的语句如下:
注意:如果update mySchema.myTable set myColumn = CONCAT( myColumn , ', "a108": "Additional Data.", "a109": "More Additional Data." ' ) where primaryKeyColumn = ( select primaryKeyColumn from mySchema.myTable where column3 = "testdata" AND column4 = "aNumber" LIMIT 1 );aNumber是字符串类型,一定要加引号;如果是数字类型可以不加,但建议统一格式避免歧义。 - 检查查询条件:确认
column3 = "testdata" AND column4 = aNumber确实能唯一匹配一行数据,可能是条件太宽泛导致匹配了多行,需要调整条件。
情况2:子查询本来就该返回多行,需要更新这些行
把=改成IN,让语句匹配所有子查询返回的主键行:
update mySchema.myTable set myColumn = CONCAT( myColumn , ', "a108": "Additional Data.", "a109": "More Additional Data." ' ) where primaryKeyColumn IN ( select primaryKeyColumn from mySchema.myTable where column3 = "testdata" AND column4 = "aNumber" );
更稳妥的写法:用JOIN替代子查询
为了避免同表子查询的限制,推荐用JOIN的方式改写语句,这也是MySQL中更高效的写法:
UPDATE mySchema.myTable t1 JOIN mySchema.myTable t2 ON t1.primaryKeyColumn = t2.primaryKeyColumn SET t1.myColumn = CONCAT(t1.myColumn, ', "a108": "Additional Data.", "a109": "More Additional Data."') WHERE t2.column3 = "testdata" AND t2.column4 = "aNumber";
额外小提示
你拼接的字符串末尾有个多余的'(即"'),建议修正为"结尾,避免后续如果把myColumn作为JSON解析时出现格式错误。
内容的提问来源于stack exchange,提问作者RoryLatham
相关产品推荐
相关产品推荐

