代码之家  ›  专栏  ›  技术社区  ›  Dan YOU

MySQL选择内部更新

  •  4
  • Dan YOU  · 技术社区  · 16 年前
    UPDATE forms SET
    
    pos = (SELECT MIN(pos)-1 FROM forms)
    
    WHERE id=$id
    

    这不起作用,错误消息:

    **You can't specify target table 'form' for update in FROM clause**
    

    我希望很清楚:我想从同一个表中获取最小元素-1并将其分配给pos

    4 回复  |  直到 14 年前
        1
  •  9
  •   Mark Byers    16 年前

    康斯普说它不受支持是对的。不过,还有一个解决办法:

    UPDATE forms SET
    pos = (SELECT MIN(pos)-1 FROM (SELECT * FROM forms) AS x)
    WHERE id=$id
    

    可能更快的版本:

    UPDATE forms 
    SET pos = (SELECT pos-1 FROM (SELECT MIN(pos) AS pos FROM forms) AS x)
    where id=$id
    
        2
  •  4
  •   Conspicuous Compiler    16 年前

    你的问题 is stated plainly in the MySQL manual :

    当前,不能更新表并从子查询中的同一表中进行选择。

    您将要使用事务。关闭自动提交,开始一个事务,然后从表单中选择min(pos)-1进行更新,获取结果,用它进行更新,然后提交您的事务。

        3
  •  1
  •   RAO    16 年前

    我认为不能在update语句中使用子查询,但无论如何都有解决方法…

    以下是来自以下网站的报价:

    "dev.mysql.com"

    _目前,您不能从一个表中删除并从子查询中的同一个表中选择__

        4
  •  0
  •   cmptrgeekken    16 年前

    您也可以尝试:

    START TRANSACTION;
    SET @newMin := MIN(pos)-1 FROM forms;
    UPDATE forms SET pos=@newMin WHERE id='$id';
    COMMIT;
    
    推荐文章