2009-12-23 72 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"

「目前,您無法從表中刪除,並在子查詢中從同一個表中選擇」