国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL SELECT同時UPDATE同一張表問題發生及解決

2024-07-24 12:40:55
字體:
來源:轉載
供稿:網友
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問題是在運行時。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江西省| 新邵县| 兰考县| 甘德县| 昌都县| 兴国县| 鄂托克旗| 石台县| 新平| 顺昌县| 铅山县| 宣城市| 崇明县| 无为县| 会泽县| 镇远县| 东安县| 安达市| 汕尾市| 长兴县| 麻阳| 绥中县| 镇坪县| 天台县| 新泰市| 安多县| 湖州市| 葫芦岛市| 江城| 丰顺县| 邵阳县| 宾阳县| 郑州市| 铅山县| 哈巴河县| 镇康县| 枣强县| 铁岭市| 远安县| 姚安县| 固安县|