MySQL不容許SELECT FROM後面指向用做UPDATE的表,有時候讓人糾結。本文解釋如何UPDATE一張表,同時在查詢子句中使用SELECT. 問題描述 假設我要UPDATE的表跟查詢子句是同一張表,這樣作有許多種緣由,例如用統計數據更新表的字段(此時須要用group子句返回統計值),從某一條記錄的字段update另外一條記錄,而沒必要使用非標準的語句,等等。舉個例子:app
create table apples(variety char(10) primary key, price int);ci
insert into apples values('fuji', 5), ('gala', 6);get
update apples
set price = (select price from apples where variety = 'gala')
where variety = 'fuji';io
錯誤提示是:ERROR 1093 (HY000): You can't specify target table 'apples' for update in FROM clause. MySQL手冊UPDATE documentation這下面有說明 : 「Currently, you cannot update a table and select from the same table in a subquery.」 在這個例子中,要解決問題也十分簡單,但有時候不得不經過查詢子句來update目標。好在咱們有辦法。table
解決辦法 既然MySQL是經過臨時表來實現FROM子句裏面的嵌套查詢,那麼把嵌套查詢裝進另一個嵌套查詢裏,可以使FROM子句查詢和保存都是在臨時表裏進行,而後間接地在外圍查詢被引用。下面的語句是正確的:date
update apples
set price = (
select price from (
select * from apples
) as x
where variety = 'gala')
where variety = 'fuji';select