MySQL不允許SELECT FROM後面指向用作UPDATE的表,有時會讓人糾結。當然,有比創建無休止的臨時表更好的方法。本文解釋如何UPDATE一張表,同時在查詢子句中使用SELECT.
問題描述
假設我要UPDATE的表跟查詢子句是同一張表,這樣做有許多種原因,例如用統計數據更新表的欄位(此時需要用group子句傳回統計值),從某一筆記錄的欄位update另一筆記錄,而不必使用非標準的語句,等等。舉個例子:
create table apples(variety char(10) primary key, price int);
insert into apples values('fuji', 5), ('gala', 6);
update apples
apples ); select price from apples where variety = 'gala')
where variety = 'fuji';
錯誤提示是:ERROR 1093 (HY000): You can't specify target table 'apples' for update in FROMify.這下面有說明: “Currently, you cannot update a table and select from the same table in a subquery.”
在這個例子中,要解決問題也十分簡單,但有時候不得不通過查詢子句來update目標。好在我們有辦法。
解決方法
既然MySQL是透過臨時表來實現FROM子句裡面的巢狀查詢,那麼把巢狀查詢裝進另外一個巢狀查詢裡,可使FROM子句查詢和保存都是在臨時表裡進行,然後間接地在外圍查詢被引用。下面的語句是正確的:
update apples
set price = (
select price from (
select *
where variety = 'fuji';
以上是MySQL資料庫在select同時進行update操作的方法的內容,更多相關內容請關注PHP中文網(www.php.cn)!