You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL更新重复prod_skuid报错求助:嵌套查询更新脚本问题

解决更新重复prod_skuid时的MySQL报错问题

嘿,我看了你遇到的问题——单独运行那个生成新prod_skuid的子查询完全没问题,但套上UPDATE就报错对吧?这主要是因为你的UPDATE语句语法有误,而且MySQL在更新同一张表时,直接引用自身的子查询会有语法限制。

先给你一个能正常运行的修正版UPDATE脚本:

UPDATE tbl_product t1
JOIN (
    SELECT p_id, prod_skuid 
    FROM (
        SELECT 
            p_id,
            IF(@row = prod_skuid, @count, @count := 1),
            CONCAT(prod_skuid, '', @count) as prod_skuid,
            @row := prod_skuid,
            @count := @count + 1
        FROM tbl_product 
        JOIN (SELECT @count := 0, @row := "") as t 
        WHERE prod_skuid IN(
            SELECT prod_skuid 
            FROM tbl_product 
            GROUP BY prod_skuid 
            HAVING count(prod_skuid) > 1
        )
    ) as final
) as t ON t1.p_id = t.p_id
SET t1.prod_skuid = t.prod_skuid;

错误原因说明:

  • 你原来的UPDATE语句里,SET t1.prod_skuid = t.prod_skuid ( SELECT ... )这部分写法完全错误,正确的做法是先通过JOIN把原表和生成新值的临时表关联起来,再进行赋值操作。
  • MySQL不允许在UPDATE/DELETE操作中,直接在SET或WHERE子句里引用正在被修改的表的子查询,用JOIN关联临时表的方式就能避开这个限制。

另外,你那个能正常运行的查询语句是没问题的,只是套进UPDATE时的写法错了:

SELECT p_id, prod_skuid 
FROM (
    SELECT 
        p_id,
        IF(@row = prod_skuid, @count, @count := 1),
        CONCAT(prod_skuid, '', @count) as prod_skuid,
        @row := prod_skuid,
        @count := @count + 1
    FROM tbl_product 
    JOIN (SELECT @count := 0, @row := "") as t 
    WHERE prod_skuid IN(
        SELECT prod_skuid 
        FROM tbl_product 
        GROUP BY prod_skuid 
        HAVING count(prod_skuid) > 1
    )
) as final

内容的提问来源于stack exchange,提问作者Leonard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:10:37