2009-12-23 81 views
4
UPDATE forms SET 

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

WHERE id=$id 

这不起作用,错误消息:mysql的SELECT里面UPDATE

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

我希望这是明确的:我想从同一个表中的最小元素-1并指定为POS

回答

9

consp是正确的,它不被支持。有一种解决方法,但是:

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 
+0

+1“螺丝您的任意异想天开的限制”。希望它可以工作,但我不再使用mysql了。 – 2009-12-24 00:07:03

+0

工作!尊重标志! – Dan 2009-12-24 00:13:47

+0

......家伙不要忘记使用isnull()以防万一表为空 – Dan 2009-12-24 00:32:42

4

您的问题is stated plainly in the MySQL manual

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

你会想要使用一个事务。关闭AutoCommit,开始一个事务,然后执行SELECT MIN(pos)-1 FROM forms FOR UPDATE,获取该结果,使用它进行更新,然后提交事务。

0

您也可以尝试:

START TRANSACTION; 
SET @newMin := MIN(pos)-1 FROM forms; 
UPDATE forms SET [email protected] WHERE id='$id'; 
COMMIT; 
1

我认为你不能使用子查询内的更新声明,但任何方式有它的解决方法...

这是来自follo翼网站:

"dev.mysql.com"

“目前,您无法从表中删除,并在子查询中从同一个表中选择”