日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

MySQL SELECT同時UPDATE同一張表問題發(fā)生及解決_MySQL教程

編輯Tag賺U幣
教程Tag:Selectupdate添加

推薦:Windows環(huán)境下重置mysql密碼操作命令
Windows XP系統(tǒng)、xampp集成環(huán)境如何重置mysql密碼,接下來為大家詳細介紹下,感興趣的各位可以參考下哈,希望可以幫助到你們

MySQL不允許SELECT FROM后面指向用作UPDATE的表,有時候讓人糾結(jié)。當然,有比創(chuàng)建無休止的臨時表更好的辦法。本文解釋如何UPDATE一張表,同時在查詢子句中使用SELECT.

問題描述
假設(shè)我要UPDATE的表跟查詢子句是同一張表,這樣做有許多種原因,例如用統(tǒng)計數(shù)據(jù)更新表的字段(此時需要用group子句返回統(tǒng)計值),從某一條記錄的字段update另一條記錄,而不必使用非標準的語句,等等。舉個例子:
復制代碼 代碼如下:hl5o.cn

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手冊這下面有說明 : “Currently, you cannot update a table and select from the same table in a subquery.”
在這個例子中,要解決問題也十分簡單,但有時候不得不通過查詢子句來update目標。好在我們有辦法。

解決辦法
既然MySQL是通過臨時表來實現(xiàn)FROM子句里面的嵌套查詢,那么把嵌套查詢裝進另外一個嵌套查詢里,可使FROM子句查詢和保存都是在臨時表里進行,然后間接地在外圍查詢被引用。下面的語句是正確的:
復制代碼 代碼如下:hl5o.cn

update apples
set price = (
select price from (
select * from apples
) as x
where variety = 'gala')
where variety = 'fuji';

如果你想了解更多其中的機制,請閱讀相關(guān)章節(jié)。

沒有解決的問題
一個常見的問題是,IN()子句優(yōu)化廢品,被重寫成相關(guān)的嵌套查詢,有時(往往?)造成性能低下。把嵌套查詢裝進另外一個嵌套查詢里并不能阻止它重寫成相關(guān)嵌套,除非我下狠招。這種情況下,最好用JOIN重構(gòu)查詢(rewrite such a query as a join)。

另一個沒解決的問題是臨時表被引用多次�!把b進嵌套查詢”的技巧無法解決這些問題,因為它們在編譯時被創(chuàng)建,而上面討論的update問題是在運行時。

分享:MySQL DELETE語法使用詳細解析
此文章主要講述的是MySQL DELETE語法的詳細解析,以及一些在實際操作中值得我們大家注意的相關(guān)事項的描述,以下就是正文的主要內(nèi)容

來源:模板無憂//所屬分類:MySQL教程/更新時間:2013-04-22
相關(guān)MySQL教程