租房平台网站开发,宣传软文案例,广州软件开发工资怎么样,旅游网站开发结束语某天#xff0c;正按照业务的要求删除不需要的数据#xff0c;在执行 DELETE 语句时#xff0c;竟然出现了报错#xff01; 作者#xff1a;林靖华#xff0c;开源数据库技术爱好者#xff0c;擅长MySQL和Redis的运维 爱可生开源社区出品#xff0c;原创内容未经授权不…某天正按照业务的要求删除不需要的数据在执行 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.idt2.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.idt2.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.idtest2.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