数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL

本文主要基于 Sharding-JDBC 1.5.0 正式版

  • 1. 概述
  • 2. DeleteStatement
  • 3. #parse()
    • 3.1 #skipBetweenDeleteAndTable()
    • 3.2 #parseSingleTable()
    • 3.3 #parseWhere()

1. 概述

本文前置阅读:

  • 《SQL 解析(一)之词法解析》
  • 《SQL 解析(二)之SQL解析》

本文分享删除SQL解析的源码实现。

? 如果你已经理解《SQL 解析(三)之查询SQL》,那本文会是一篇水文,当成一种放松吧。还是跟前文一样,以 MySQL 举例子。我们来一起看看 MySQLDeleteParser。

MySQL DELETE 语法一共有 2 种 :

  • 第一种:Single-table syntax
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [PARTITION (partition_name,...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
  • 第二种:Multiple-table syntax
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

【OR】

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

Sharding-JDBC 目前仅支持第一种。业务场景上使用第二种的很少很少。

Sharding-JDBC 更新SQL解析主流程如下:

// AbstractDeleteParser.java
@Override
public DeleteStatement parse() {
   sqlParser.getLexer().nextToken(); // 跳过 DELETE
   skipBetweenDeleteAndTable(); // // 跳过关键字,例如:MYSQL 里的 LOW_PRIORITY、IGNORE 和 FROM
   sqlParser.parseSingleTable(deleteStatement); // 解析表
   sqlParser.skipUntil(DefaultKeyword.WHERE); // 跳到 WHERE
   sqlParser.parseWhere(deleteStatement); // 解析 WHERE
   return deleteStatement;
}

2. DeleteStatement

删除SQL 解析结果。

public final class UpdateStatement extends AbstractSQLStatement {
}

? 对,没有其他属性。

我们来看下 DELETE IGNORE FROM t_user WHERE user_id=?解析结果

3. #parse()

3.1 #skipBetweenDeleteAndTable()

DELETE 和 表名 之间有些词法,对 SQL 路由和改写无影响,进行跳过。

// MySQLDeleteParser.java
@Override
protected void skipBetweenDeleteAndTable() {
   getSqlParser().skipAll(MySQLKeyword.LOW_PRIORITY, MySQLKeyword.QUICK, MySQLKeyword.IGNORE);
   getSqlParser().skipIfEqual(DefaultKeyword.FROM);
}

// OracleDeleteParser.java
@Override
protected void skipBetweenDeleteAndTable() {
   getSqlParser().skipIfEqual(DefaultKeyword.FROM);
   getSqlParser().skipIfEqual(OracleKeyword.ONLY);
}

3.2 #parseSingleTable()

解析,请看《SQL 解析(二)之SQL解析》的 #parseSingleTable() 小节。

3.3 #parseWhere()

解析 WHERE 条件。解析代码:《SQL 解析(二)之SQL解析》的#parseWhere()小节。

原文发布于微信公众号 - 芋道源码(YunaiV)

原文发表时间:2017-08-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

join和where区别以及各类join的示例

1 WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。INNER JOIN……ON子句产生的连接称为显性连接。(其他JOIN参数也是显性连接...

219100
来自专栏xingoo, 一个梦想做发明家的程序员

oracle数据结构

 数据类型: 1 字符数据:CHAR VARCHAR NCHAR NVARCHAR2 LONG CLOB NCLOB  2 数字数据类型:NUMBER 唯一用来...

21560
来自专栏Java后端技术栈

为什么你创建的数据库索引没有生效?

几乎所有的小伙伴都可以随口说几句关于创建索引的优缺点,也知道什么时候创建索引能够提高我们的查询性能,什么时候索引会更新,但是你有没有注意到,即使你设置了索引,有...

8710
来自专栏杨建荣的学习笔记

浅谈exp/imp(上) (r5笔记第81天)

作为DBA,经常需要在不同数据库环境间做数据的导入导出,exp/imp就是这样的轻便快捷的客户端工具,可以很方便的在不同数据库之间转移数据对象,即使数据库位于不...

30380
来自专栏乐沙弥的世界

使用 Oracle Datapump API 实现数据导出

  Oracle Datapump API 是基于PL/SQL实现的,是命令行方式下的补充。使用Datapump API可以将其逻辑备份特性将其集成到应用程序当...

18840
来自专栏乐沙弥的世界

Oracle 索引监控(monitor index)

      合理的为数据库表上创建战略性索引,可以极大程度的提高了查询性能。但事实上日常中我们所创建的索引并非战略性索引,恰恰是大量冗余或是根本没有用到的索引耗...

10810
来自专栏乐沙弥的世界

Oracle 重建索引脚本

      索引是提高数据库查询性能的有力武器。没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难。然而索引在使用的过程中,尤其是在批量的D...

11910
来自专栏杨建荣的学习笔记

临时表相关 (r4笔记第52天)

临时表在日常工作中可能使用比较多,但是大家都对临时表相关的一些知识了解比较少。我们来简单说数理一下。 首先是临时表空间,临时表都存储在临时表空间中,对于临时表...

28050
来自专栏Grace development

MySQL SQL模式特点汇总

MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值。DBA可以设置全局SQL...

16520
来自专栏杨建荣的学习笔记

关于trigger过滤最大值的问题(54天)

今天碰到一个问题,开发有一个比较紧的需要,想问问我数据库这边能不能帮上忙。 如果开发那边来做,需要改代码,如果数据库这边能临时支持,代码就可以多做些测试,然后再...

29450

扫码关注云+社区

领取腾讯云代金券