Mysql SELECT inside UPDATE

前端 未结 4 1808
UPDATE forms SET

pos = (SELECT MIN(pos)-1 FROM forms)

WHERE id=$id

This doesn\'t work, error message:

**You can\'t specify target         


        
相关标签:
4条回答
  • 2020-12-31 20:15

    You could also try:

    START TRANSACTION;
    SET @newMin := MIN(pos)-1 FROM forms;
    UPDATE forms SET pos=@newMin WHERE id='$id';
    COMMIT;
    
    0 讨论(0)
  • 2020-12-31 20:32

    Your problem is stated plainly in the MySQL manual:

    Currently, you cannot update a table and select from the same table in a subquery.

    You'll want to use a transaction. Turn AutoCommit off, begin a transaction, then do a SELECT MIN(pos)-1 FROM forms FOR UPDATE, take that result, do the update with it, then commit your transaction.

    0 讨论(0)
  • 2020-12-31 20:34

    Consp is right that it's not supported. There's a workaround, however:

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

    A version that is probably faster:

    UPDATE forms 
    SET pos = (SELECT pos-1 FROM (SELECT MIN(pos) AS pos FROM forms) AS x)
    where id=$id
    
    0 讨论(0)
  • 2020-12-31 20:35

    I think that you can not use a subquery inside an update statement, but any way there are workarounds for it ...

    Here is a Quotation from the following site:

    "dev.mysql.com"

    “Currently, you cannot delete from a table and select from the same table in a sub-query ”

    0 讨论(0)
提交回复
热议问题