解析MySQL中DELETE語(yǔ)句中別名的使用
背景
某天,正按照業(yè)務(wù)的要求刪除不需要的數(shù)據(jù),在執(zhí)行 DELETE 語(yǔ)句時(shí),竟然出現(xiàn)了報(bào)錯(cuò)(MySQL 數(shù)據(jù)庫(kù)版本 5.7.34):
mysql> delete from test1 t1 where not exists (select 1 from test2 t2 where t1.id=t2.id);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't1 where not exists (select 1 from test2 t2 where t1.id=t2.id)' at line 1
這就有點(diǎn)奇怪了,因?yàn)槲以趫?zhí)行刪除語(yǔ)句之前,執(zhí)行過(guò)同樣條件的 SELECT 語(yǔ)句,只是把其中的 select *
換成了 delete
而已,畢竟這個(gè)語(yǔ)法的報(bào)錯(cuò)一般來(lái)說(shuō)原因很大可能是 關(guān)鍵字拼寫錯(cuò)誤 或者 存在中文符號(hào)。
排除了上面的原因后,再?gòu)恼Z(yǔ)句本身的邏輯來(lái)排查,難道說(shuō) DELETE 語(yǔ)句不支持 not exists
這種寫法?好像之前也沒(méi)聽(tīng)說(shuō)過(guò)這個(gè)限制。我們還是以語(yǔ)法錯(cuò)誤這個(gè)原因?yàn)槠瘘c(diǎn),去查查官方文檔看下能不能找出答案。
分析
DELETE 的語(yǔ)法如下
5.7 單表刪除格式
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [PARTITION (partition_name [, partition_name] ...)] [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
仔細(xì)對(duì)比了以下,發(fā)現(xiàn)了一些端倪,這里的語(yǔ)法并沒(méi)有寫出表名的別名用法,難道是使用了別名的原因?
mysql> delete from test1 where not exists (select 1 from test2 where test1.id=test2.id); Query OK, 1 row affected (0.00 sec)
經(jīng)測(cè)試去掉了別名還真的執(zhí)行成功了,但我印象中之前刪除數(shù)據(jù)的時(shí)候用過(guò)別名,于是我再繼續(xù)深挖文檔查查看。
對(duì)比不同地方和不同版本的格式差異后,我終于明白了問(wèn)題的起因。在不同版本,甚至不同情況下都有差異。
8.0 單表刪除格式
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias] [PARTITION (partition_name [, partition_name] ...)] [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
5.7 和 8.0 多表刪除格式
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition] DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition]
經(jīng)過(guò)上面語(yǔ)法對(duì)比的不同發(fā)現(xiàn),5.7 的單表刪除確實(shí)不支持別名的使用,但是多表刪除卻支持(table_references
里包含別名的使用)。
并且在 8.0.16 開(kāi)始,單表刪除已經(jīng)支持使用別名了。
For consistency with the SQL standard and other RDBMS, table aliases are now supported in single-table as well as multi-table DELETE statements. (Bug #27455809)
結(jié)論
- MySQL 5.7 使用單表刪除語(yǔ)句時(shí),不能使用別名,多表刪除可以使用別名。
- MySQL 8.0.16 開(kāi)始單表多表都可以使用別名。
以上就是解析MySQL中DELETE語(yǔ)句中別名的使用的詳細(xì)內(nèi)容,更多關(guān)于MySQL DELETE語(yǔ)句別名的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
3種高效的Tags標(biāo)簽系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)方案分享
這篇文章主要介紹了3種高效的Tags標(biāo)簽系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)方案分享,現(xiàn)在主流的博客、CMS系統(tǒng)都有一個(gè)標(biāo)簽系統(tǒng),本文就探討它的數(shù)據(jù)庫(kù)設(shè)計(jì)方式,需要的朋友可以參考下2014-07-07MySQL高效模糊搜索之內(nèi)置函數(shù)locate instr position find_in_set使用詳解
在MySQL中一般進(jìn)行模糊搜索都是使用LIKE配合通配符進(jìn)行查詢的,在性能上一定的影響,下面給大家分享MYSQL自帶的內(nèi)置模糊搜索函數(shù),除最后一個(gè)外其它三個(gè)性能上要比Like快些2018-09-09MySQL中的binlog相關(guān)命令和恢復(fù)技巧
這篇文章主要介紹了MySQL中的binlog相關(guān)命令和恢復(fù)技巧,需要的朋友可以參考下2014-05-05MySQL一個(gè)語(yǔ)句查出各種整形占用字節(jié)數(shù)及最大最小值的實(shí)例
下面小編就為大家?guī)?lái)一篇MySQL一個(gè)語(yǔ)句查出各種整形占用字節(jié)數(shù)及最大最小值的實(shí)例。2017-03-03