SQL限制
SQL大类限制
- 不支持用户自定义数据类型、自定义函数。
- 不支持视图、存储过程、触发器、游标。
- 不支持BEGIN…END、LOOP…END LOOP、REPEAT…UNTIL…END REPEAT、WHILE…DO…END WHILE等复合语句。
- 不支类似IF,WHILE等流程控制类语句。
- 不支持SAVEPOINT操作。
- 不支持SQL里带schema操作。
小语法限制
DDL
- 不支持CREATE TABLE tbl_name LIKE old_tbl_name。
- 不支持CREATE TABLE tbl_name SELECT statement。
DML
- 不支持update分片键的值。
- 不支持SELECT INTO OUTFILE/INTO DUMPFILE/INTO var_name。
- 不支持INSERT DELAYED Syntax。
- 不支持非WHERE条件的Correlate Subquery。
- 不支持SQL中带聚合条件的Correlate Subquery。
- 不支持Global的变更,比如SET GLOBAL var=xx 或者SET @@global.var=xx。
- 不支持SQL中对于变量的引用和操作,比如SET @c=1, @d=@c+1; SELECT @c, @d。
数据库管理
- SHOW WARNINGS Syntax不支持LIMIT/COUNT的组合。
- SHOW ERRORS Syntax不支持LIMIT/COUNT的组合。
SQL语句限制
union约束
- 使用union关键字的sql,要求其中涉及的分片表的分片规则及配置参数一致,使用union all关键字的sql则无此要求。
- 分片表不支持union/union all与聚合函数、limit、groupby、having、orderby等关键字联用。
- 不支持分片表和全局表union。
JDBC约束
- 不支持rewriteBatchedStatements=true参数设置(默认为false)。
- 不支持useServerPrepStmts=true参数设置(默认为false)。
- BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法设置参数。
库内分表约束
SQL中union/union all关键字使用的注意事项
- 不支持包含InnerTable的union运算,比如两个InnerTable,InnerTable与分片表,InnerTable与全局表。
- 不支持包含InnerTable的union/union all与聚合函数、limit、groupby、having、orderby等关键字运算。
- 当分组属性中参数:isPermitComplexInnerTableSql=“true”时,允许union、union all中使用两个及两个以上的库内分表,反之禁止。
聚合函数
- 不支持在包含InnerTable的sql中使用包含聚合函数及运算的的表达式(诸如count(*)+' ')。
having关键字的使用注意事项
- having条件中不支持“and”或“or”连接的多个表达式。
- having条件中请在表达式左侧使用字段或别名,右侧使用过滤值。
- having条件中请使用字段或函数的别名,请勿使用函数本身。
- 主SQL语句的having中不支持subquery,只能处理常量;子查询语句的having中支持subquery。
子查询
- 不支持包含InnerTable的子查询语句中“*”关键字和聚合函数一起使用。
- 不支持子查询中InnerTable的数量大于1。
- 不支持包含InnerTable的子查询中使用包含聚合函数及运算的的表达式(诸如count(*)+' ')。
- 不支持包含InnerTable的子查询中使用union/union all。
- 不支持delete、update语句中使用包含InnerTable的子查询。
- 不支持delete、update语句包含InnerTable在内的多表操作。