SQL

    本文详细罗列出已明确可支持的SQL种类以及已明确不支持的SQL种类,尽量让使用者避免踩坑。

    其中必然有未涉及到的SQL欢迎补充,未支持的SQL也尽量会在未来的版本中支持。

    • 100%全兼容(目前仅MySQL,其他数据库完善中)。

    路由至多数据节点

    全面支持DML、DDL、DCL、TCL和部分DAL。支持分页、去重、排序、分组、聚合、关联查询(不支持跨库关联)。以下用最为复杂的DML举例:

    • SELECT主语句
    • select_expr
    1. [DISTINCT] COLUMN_NAME [AS] [alias] |
    2. COUNT(* | COLUMN_NAME | alias) [AS] [alias]
    • table_reference

    不支持CASE WHEN、HAVING、UNION (ALL),有限支持子查询。

    例如,以下子查询可以支持:

      以下子查询不支持:

      简单来说,通过子查询进行非功能需求,在大部分情况下是可以支持的。比如分页、统计总数等;而通过子查询实现业务查询当前并不能支持。

      由于归并的限制,子查询中包含聚合函数目前无法支持。

      对分片键进行操作

      运算表达式和函数中的分片键会导致全路由。

      假设create_time为分片键,则无法精确路由形如SQL:

      由于ShardingSphere只能通过SQL字面提取用于分片的值,因此当分片键处于运算表达式或函数中时,ShardingSphere无法提前获取分片键位于数据库中的值,从而无法计算出真正的分片值。

      当出现此类分片键处于运算表达式或函数中的SQL时,ShardingSphere将采用全路由的形式获取结果。

      不支持的SQL

      不支持的SQL