2012年8月1日 星期三

Can't specify target table for update in FROM clause

參考資料:
1、Mysql error 1093 - Can't specify target table for update in FROM clause
2、PHP/MYSQL using an array in WHERE clause

原本我想要在資料表裡面把符合某個條件的值撈出來,然後把他們從資料庫裡刪掉
於是下了類似這樣的 SQL Statement:
DELETE FROM table WHERE id IN (SELECT * FROM table WHERE time < 11111111);
其實這段 SQL Statement 很明顯根本不用用到 SELECT...XD
只是...反正這只是個範例就是了,不要太在意!XD

這段敘述執行時會出現 Can't specify table for update in FROM clause 的錯誤訊息。
根據 [1] 的說明,MySQL 的文件中有描述到,在進行 SELECT 敘述時是不允許對同一張 table 做修改的
因此除非要把這個動作拆成兩個,否則一般狀況這樣子的指令難以執行。
[1] 的回應中有一種解法是讓 SELECT 出來的結果暫存成另外一張資料表
這樣對 MySQL 來說就不是存取同一張資料表了,但這樣同時會有效能上的問題
畢竟特別開一張暫存的資料表、做完處理又要把暫存資料表刪掉的動作是很浪費時間的。

題外話,MySQL 如果想要指定刪除一堆資料,但要刪除的資料要自行指定,可以用 WHERE IN 來達成(參考 [2])
其中 IN 後面可以用逗號分隔,把要刪除的指定資料列進去
例如:
DELETE FROM ticket WHERE account IN ('a', 'b', 'c')
當然這個方法適用任何需要搭配 WHERE IN 來自行指定的狀況。

沒有留言: