MySQL 中 DELETE 语句中可以使用别名么?

某天,正按照业务的要求删除不需要的数据,在执行 DELETE 语句时,竟然出现了报错!

作者:林靖华,开源数据库技术爱好者,擅长MySQL和Redis的运维

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 650 字,预计阅读需要 2 分钟。

背景

某天,正按照业务的要求删除不需要的数据,在执行 DELETE 语句时,竟然出现了报错(MySQL 数据库版本 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

这就有点奇怪了,因为我在执行删除语句之前,执行过同样条件的 SELECT 语句,只是把其中的 select * 换成了 delete 而已,毕竟这个语法的报错一般来说原因很大可能是 关键字拼写错误 或者 存在中文符号

排除了上面的原因后,再从语句本身的逻辑来排查,难道说 DELETE 语句不支持 not exists 这种写法?好像之前也没听说过这个限制。我们还是以语法错误这个原因为起点,去查查官方文档看下能不能找出答案。

分析

DELETE 的语法如下:

5.7 单表删除格式

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[PARTITION (partition_name [, partition_name] ...)][WHERE where_condition][ORDER BY ...][LIMIT row_count]

仔细对比了以下,发现了一些端倪,这里的语法并没有写出表名的别名用法,难道是使用了别名的原因?

mysql> delete from test1 where not exists (select 1 from test2 where test1.id=test2.id);
Query OK, 1 row affected (0.00 sec)

经测试去掉了别名还真的执行成功了,但我印象中之前删除数据的时候用过别名,于是我再继续深挖文档查查看。

对比不同地方和不同版本的格式差异后,我终于明白了问题的起因。在不同版本,甚至不同情况下都有差异。

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]

经过上面语法对比的不同发现,5.7 的单表删除确实不支持别名的使用,但是多表删除却支持(table_references 里包含别名的使用)。

并且在 8.0.16 开始,单表删除已经支持使用别名了。

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)

结论

  • MySQL 5.7 使用单表删除语句时,不能使用别名,多表删除可以使用别名。
  • MySQL 8.0.16 开始单表多表都可以使用别名。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql查看Binlog文件

前期准备 检查是否开启binlog mysql> SHOW VARIABLES LIKE log_bin; // 或者 mysql> SHOW VARIABLES LIKE log%;ON代表开启,OFF代表关闭。如为OFF需 开启 后才能查看,但只能查看开启之后时间点的。 查看binlog文件有哪些 一般yum安装的mysql…

【python学习】基础篇-常用第三方库-chardet:检测文本文件的编码格式

chardet是一个Python库,用于检测文本文件的编码格式。 以下是一些基本的用法: 使用chardet.detect()函数检测文件编码 with open(example.txt, rb) as f:result chardet.detect(f.read()) print(result[encoding])使用chardet.detect()函数检测字节串…

【python学习】基础篇-常用第三方库-requests库:用于发送各种类型的HTTP请求

在Python中,requests库是一个常用的HTTP请求库,用于发送各种类型的HTTP请求。 以下是一些基本的用法: 更多高级功能可以参考官方文档:https://docs.python-requests.org/ 发送GET请求 response requests.get(https://www.examp…

Program Header Table(转载)

程序头表与段表相互独立,由ELF文件头统一管理。 程序头表负责ELF文件从文件到加载后映像的映射关系,一般只有可执行文件包含。 1. segment和section segment: 程序头表项描述的对象称为segment,即elf文件加载后的数据块; 它提供…

exports和module.exports 区别

在 Node.js 中,“exports”和“module.exports”两者的区别有以下几点: 导出对象类型不同: exports 是对 module.exports 的一个全局引用,而实际导出的是 module.exports 对象。即 exports 只是为了方便,可以在不断开…

C++学习(2):分配器allocator

new和operator new new是关键字,new 操作符的执行过程: 调用operator new分配内存;调用构造函数在operator new返回的内存地址处生成类对象; operator new是一个函数,可以被重载,通过重载它,…

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中,暴露在外网的接口,为了访问的安全,都是需要在http请求中传入登录时颁发的token。这时候,我们需要有专门用来做校验token并解析用户信息的服务。如下图所示,http请求先经过api网关,网…

[点云分割] 欧式距离分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <chrono>#include <pcl/ModelCoefficients.h> // 模型系数的定义 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/sample_c…

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做&#xff1a;Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面&#xff1a; 代码主界面主要讲解的是 …

window文件夹下python脚本实现批量删除无法预览的图片

你是否遇到过下载的图片会发现有些图片会无法预览情况&#xff1f; 有几种原因可能导致一些图片在预览时无法正常显示&#xff1a; 损坏的图片文件&#xff1a; 图片文件可能损坏或者部分损坏&#xff0c;导致无法被正常解析和预览。这种情况可能是因为文件在传输过程中损坏、…

蓝桥等考C++组别八级003

第一部分:选择题 1、C++ L8 (15分) 整数16,20的最大公约数(公因数)是( )。 A. 1 B. 2 C. 4 D. 80 正确答案:C

机器学习入门(第二天)——感知机

概述 每个算法都是为了解决一类问题&#xff0c;或者说解决之前的问题所创造出来的&#xff0c;而感知机&#xff0c;在解决一类问题的时候也暴露了很多问题&#xff0c;变相的推动了以后的算法的改进方向。 知识树 苹果表示相对重要的 直观介绍 现在有一盘红豆和绿豆&#…

Caused by: java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

今天项目启动时报错&#xff0c;刻意记录一下&#xff0c;具体报错部分日志如下&#xff1a; Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name sqlSessionFactory defined in class path resource [com/baomidou/mybatis…

2014年8月20日 Go生态洞察:Go在OSCON的精彩亮相

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

使用Vue.js编写页面组件的简单步骤

Vue.js是一个流行的JavaScript框架&#xff0c;用于构建交互式的用户界面。通过Vue&#xff0c;你可以轻松地构建单页面应用&#xff08;SPA&#xff09;并管理页面上的组件。在本篇博文中&#xff0c;我们将介绍如何使用Vue.js编写一个简单的页面组件。 步骤 1: 引入 Vue.js …

Redis+整合SpringDataRedis

Nosql和缓存的背景 数据库架构设计的发展史 第一阶段&#xff1a;单库&#xff1a;随着访问量的增加出现了性能问题 第二阶段&#xff1a;缓存&#xff1a;通过缓存&#xff0c;缓解数据库的压力&#xff0c;优化数据结构和索引 第三阶段&#xff1a;读写分离&#xff1a;数据…

分割list 批量插入数据指定条数数据

一、代码层面切割好list&#xff0c;然后插入 // package org.apache.commons.collections4; 先将list切成1000条一份 List<List<DeptDO>> p1 ListUtils.partition(deptList, 1000); for (List<DeptDO> deptDOS : p1) { // 1000条一次批量插入systemDeptMa…

c# 逆变 / 协变

个人理解&#xff1a; 1. 逆变in向上兼容类 2. 协变out向下兼容类 在面向对象编程中&#xff0c;尤其是使用泛型时&#xff0c;in和out关键字用于限制类型参数的协变性和逆变性。 in关键字&#xff08;逆变&#xff09;&#xff1a; in关键字用于标记泛型类型参数的逆变性。…

Vue History模式的Nginx配置

前言 vue-router有两种模式&#xff0c;hash模式和history模式。直观区别&#xff1a;hash模式url带#号&#xff0c;history模式不带#号。hash模式&#xff1a;由于hash值变化不会导致游览器向服务器发出请求&#xff0c;所以可以实现前端路由&#xff0c;无需额外的配置。his…

网络异常检测

随着社交网络、视频流、点对点技术、云计算和 SaaS 的出现&#xff0c;可以肯定地说&#xff0c;现代企业的好坏取决于他们的网络&#xff0c;尤其是在它们提供的带宽和安全性方面。无论是银行保护其数据免遭盗窃&#xff0c;还是商业组织保护其网络免受安全威胁和攻击&#xf…