SQL UPDATE语句提示SET is not valid at this position报错原因及解决
SQL更新语句SET关键字报错问题解答
报错触发原因
- 直接语法错误:一条
UPDATE语句仅允许使用1次SET关键字,所有需要更新的字段需要统一罗列在同一个SET之后,字段之间用逗号分隔即可。你第一条语句在第二个要更新的字段symbol前多加了一个SET,不符合SQL语法规范,因此触发报错。第二条语句仅使用了一次SET,符合语法要求所以可以正常执行。 - 隐藏逻辑错误:即使去掉多余的
SET,你的语句依然会执行失败。你用到的两个子查询select username from transaction_history group by username, symbol会返回多行结果(只要transaction_history中存在多组不同的username+symbol组合),而单字段赋值要求子查询必须返回单行单列的结果,且目前你没有写两个表的关联条件,无法将holdings的行和子查询结果一一对应,会出现逻辑错误。
正确修改方式
1. 仅修复语法报错的版本(仅解决SET报错,未解决逻辑问题,仅作参考)
UPDATE holdings A SET A.username = (select username from transaction_history group by username, symbol), A.symbol = (select symbol from transaction_history group by username, symbol);
2. 可正常运行的业务可用版本
根据通用的业务场景(将holdings的字段更新为transaction_history中对应关联记录的值),推荐使用关联更新写法,以下为MySQL语法示例,你可以替换为自己实际的表关联条件:
UPDATE holdings A -- 替换下方的关联条件为你两个表实际的关联字段 INNER JOIN transaction_history B ON A.transaction_id = B.id SET A.username = B.username, A.symbol = B.symbol;
如果确实需要使用子查询实现,需要给子查询增加过滤条件,保证返回结果为单行:
UPDATE holdings A SET A.username = (select username from transaction_history B where B.holding_id = A.id group by username, symbol), A.symbol = (select symbol from transaction_history B where B.holding_id = A.id group by username, symbol);
内容的提问来源于stack exchange,提问作者Rewan Gautam
相关产品推荐
相关产品推荐

