欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析MySQL中DELETE語(yǔ)句中別名的使用

 更新時(shí)間:2023年11月23日 09:06:54   作者:愛(ài)可生開(kāi)源社區(qū)  
這篇文章主要為大家介紹了MySQL中DELETE語(yǔ)句中別名的使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

某天,正按照業(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)文章

最新評(píng)論