MySQL SELECT同時(shí)UPDATE同一張表問(wèn)題發(fā)生及解決_MySQL教程
推薦:Windows環(huán)境下重置mysql密碼操作命令Windows XP系統(tǒng)、xampp集成環(huán)境如何重置mysql密碼,接下來(lái)為大家詳細(xì)介紹下,感興趣的各位可以參考下哈,希望可以幫助到你們
MySQL不允許SELECT FROM后面指向用作UPDATE的表,有時(shí)候讓人糾結(jié)。當(dāng)然,有比創(chuàng)建無(wú)休止的臨時(shí)表更好的辦法。本文解釋如何UPDATE一張表,同時(shí)在查詢(xún)子句中使用SELECT.問(wèn)題描述
假設(shè)我要UPDATE的表跟查詢(xún)子句是同一張表,這樣做有許多種原因,例如用統(tǒng)計(jì)數(shù)據(jù)更新表的字段(此時(shí)需要用group子句返回統(tǒng)計(jì)值),從某一條記錄的字段update另一條記錄,而不必使用非標(biāo)準(zhǔn)的語(yǔ)句,等等。舉個(gè)例子:
復(fù)制代碼 代碼如下:m.dounai2.com
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';
錯(cuò)誤提示是:ERROR 1093 (HY000): You can't specify target table 'apples' for update in FROM clause. MySQL手冊(cè)這下面有說(shuō)明 : “Currently, you cannot update a table and select from the same table in a subquery.”
在這個(gè)例子中,要解決問(wèn)題也十分簡(jiǎn)單,但有時(shí)候不得不通過(guò)查詢(xún)子句來(lái)update目標(biāo)。好在我們有辦法。
解決辦法
既然MySQL是通過(guò)臨時(shí)表來(lái)實(shí)現(xiàn)FROM子句里面的嵌套查詢(xún),那么把嵌套查詢(xún)裝進(jìn)另外一個(gè)嵌套查詢(xún)里,可使FROM子句查詢(xún)和保存都是在臨時(shí)表里進(jìn)行,然后間接地在外圍查詢(xún)被引用。下面的語(yǔ)句是正確的:
復(fù)制代碼 代碼如下:m.dounai2.com
update apples
set price = (
select price from (
select * from apples
) as x
where variety = 'gala')
where variety = 'fuji';
如果你想了解更多其中的機(jī)制,請(qǐng)閱讀相關(guān)章節(jié)。
沒(méi)有解決的問(wèn)題
一個(gè)常見(jiàn)的問(wèn)題是,IN()子句優(yōu)化廢品,被重寫(xiě)成相關(guān)的嵌套查詢(xún),有時(shí)(往往?)造成性能低下。把嵌套查詢(xún)裝進(jìn)另外一個(gè)嵌套查詢(xún)里并不能阻止它重寫(xiě)成相關(guān)嵌套,除非我下狠招。這種情況下,最好用JOIN重構(gòu)查詢(xún)(rewrite such a query as a join)。
另一個(gè)沒(méi)解決的問(wèn)題是臨時(shí)表被引用多次。“裝進(jìn)嵌套查詢(xún)”的技巧無(wú)法解決這些問(wèn)題,因?yàn)樗鼈冊(cè)诰幾g時(shí)被創(chuàng)建,而上面討論的update問(wèn)題是在運(yùn)行時(shí)。
分享:MySQL DELETE語(yǔ)法使用詳細(xì)解析此文章主要講述的是MySQL DELETE語(yǔ)法的詳細(xì)解析,以及一些在實(shí)際操作中值得我們大家注意的相關(guān)事項(xiàng)的描述,以下就是正文的主要內(nèi)容
相關(guān)MySQL教程:
- MSSQL清空日志刪除日志文件
- 關(guān)于數(shù)據(jù)庫(kù)中保留小數(shù)位的問(wèn)題
- 解析mysql與Oracle update的區(qū)別
- mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)以及函數(shù)、存儲(chǔ)過(guò)程的介紹
- MySQL——修改root密碼的4種方法(以windows為例)
- 解決MYSQL出現(xiàn)Can''t create/write to file ''#sql_5c0_0.MYD''的問(wèn)題
- 深入理解SQL的四種連接-左外連接、右外連接、內(nèi)連接、全連接
- 解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別
- mysql出現(xiàn)“Incorrect key file for table”處理方法
- mysql重裝后出現(xiàn)亂碼設(shè)置為utf8可解決
- 淺析一個(gè)MYSQL語(yǔ)法(在查詢(xún)中使用count)的兼容性問(wèn)題
- 解析MySQL中INSERT INTO SELECT的使用
MySQL教程Rss訂閱編程教程搜索
MySQL教程推薦
- MySQL筆記之系統(tǒng)信息函數(shù)詳解
- 詳解MYSQL的備份還原(PHP實(shí)現(xiàn))
- mysql占用CPU過(guò)高的解決辦法(添加索引)
- MYSQL 事件高度器
- 如何修改mysql數(shù)據(jù)庫(kù)的max_allowed_packet參數(shù)
- Mysql高性能備份方案解決數(shù)據(jù)不間斷訪問(wèn)
- KB967723補(bǔ)丁造成的MYSQL在Win2003上頻繁連接不上
- 深入探討:MySQL數(shù)據(jù)庫(kù)MyISAM與InnoDB存儲(chǔ)引擎的比較
- Mysql字符集設(shè)置指南
- 關(guān)于Mysql查詢(xún)帶單引號(hào)及插入帶單引號(hào)字符串問(wèn)題
猜你也喜歡看這些
- 詳解SQL Server中數(shù)據(jù)庫(kù)快照的工作原理
- 怎樣巧妙規(guī)劃使用Oracle數(shù)據(jù)空間
- 解讀編寫(xiě)和優(yōu)化SQL Server的存儲(chǔ)過(guò)程
- 在sqlserver2005中安裝sql server 2000的示例數(shù)據(jù)庫(kù)northwind的方法
- SQL Server 2005深層工具和運(yùn)行時(shí)間集
- 總結(jié)經(jīng)典常用的SQL語(yǔ)句(2)
- 解答使用SQL Server數(shù)據(jù)庫(kù)查詢(xún)累計(jì)值的方法
- PL/SQL DEVELOPER 使用的一些技巧
- SELECT 賦值與ORDER BY沖突的問(wèn)題
- SQL Server 2005 DTS導(dǎo)入平面數(shù)據(jù)出現(xiàn)錯(cuò)誤解決方案
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索MySQL SELECT同時(shí)UPDATE同一張表問(wèn)題發(fā)生及解決
- 教程說(shuō)明:
MySQL教程-MySQL SELECT同時(shí)UPDATE同一張表問(wèn)題發(fā)生及解決。