MySQL SELECT同時UPDATE統一張表成績產生及處理。本站提示廣大學習愛好者:(MySQL SELECT同時UPDATE統一張表成績產生及處理)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL SELECT同時UPDATE統一張表成績產生及處理正文
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
set price = (select price from apples where variety = 'gala')
where variety = 'fuji';
毛病提醒是: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目的。好在我們有方法。
處理方法
既然MySQL是經由過程暫時表來完成FROM子句外面的嵌套查詢,那末把嵌套查詢裝進別的一個嵌套查詢裡,可以使FROM子句查詢和保留都是在暫時內外停止,然後直接地在核心查詢被援用。上面的語句是准確的:
update apples
set price = (
select price from (
select * from apples
) as x
where variety = 'gala')
where variety = 'fuji';
假如你想懂得更多個中的機制,請浏覽MySQL Internals Manual相干章節。
沒有處理的成績
一個罕見的成績是,IN()子句優化廢品,被重寫成相干的嵌套查詢,有時(常常?)形成機能低下。把嵌套查詢裝進別的一個嵌套查詢裡其實不能阻攔它重寫成相干嵌套,除非我下狠招。這類情形下,最好用JOIN重構查詢(rewrite such a query as a join)。
另外一個沒處理的成績是暫時表被援用屢次。“裝進嵌套查詢”的技能沒法處理這些成績,由於它們在編譯時被創立,而下面評論辯論的update成績是在運轉時。