解析MySQL中DELETE語句中別名的使用
背景
某天,正按照業(yè)務(wù)的要求刪除不需要的數(shù)據(jù),在執(zhí)行 DELETE 語句時(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í)行刪除語句之前,執(zhí)行過同樣條件的 SELECT 語句,只是把其中的 select * 換成了 delete 而已,畢竟這個(gè)語法的報(bào)錯(cuò)一般來說原因很大可能是 關(guān)鍵字拼寫錯(cuò)誤 或者 存在中文符號(hào)。
排除了上面的原因后,再?gòu)恼Z句本身的邏輯來排查,難道說 DELETE 語句不支持 not exists 這種寫法?好像之前也沒聽說過這個(gè)限制。我們還是以語法錯(cuò)誤這個(gè)原因?yàn)槠瘘c(diǎn),去查查官方文檔看下能不能找出答案。
分析
DELETE 的語法如下
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)了一些端倪,這里的語法并沒有寫出表名的別名用法,難道是使用了別名的原因?
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í)候用過別名,于是我再繼續(xù)深挖文檔查查看。
對(duì)比不同地方和不同版本的格式差異后,我終于明白了問題的起因。在不同版本,甚至不同情況下都有差異。
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)過上面語法對(duì)比的不同發(fā)現(xiàn),5.7 的單表刪除確實(shí)不支持別名的使用,但是多表刪除卻支持(table_references 里包含別名的使用)。
并且在 8.0.16 開始,單表刪除已經(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 使用單表刪除語句時(shí),不能使用別名,多表刪除可以使用別名。
- MySQL 8.0.16 開始單表多表都可以使用別名。
以上就是解析MySQL中DELETE語句中別名的使用的詳細(xì)內(nèi)容,更多關(guān)于MySQL DELETE語句別名的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql存儲(chǔ)過程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解
這篇文章主要給大家介紹了關(guān)于mysql存儲(chǔ)過程教程之遍歷多表記錄后插入第三方表中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-07-07
MySql Installer 8.0.18可視化安裝教程圖文詳解
這篇文章主要介紹了MySql Installer 8.0.18可視化安裝教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
mysql中替代null的IFNULL()與COALESCE()函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于mysql中替代null的IFNULL()與COALESCE()函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看看吧。2017-06-06

