You need to enable JavaScript to run this app. SQL UPDATE语句提示SET is not valid at this position报错原因及解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 01:09:03