UPDATE forms SET
pos = (SELECT MIN(pos)-1 FROM forms)
WHERE id=$id
This doesn\'t work, error message:
**You can\'t specify target
You could also try:
START TRANSACTION;
SET @newMin := MIN(pos)-1 FROM forms;
UPDATE forms SET pos=@newMin WHERE id='$id';
COMMIT;
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.
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
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 ”