
# 不支持的特性和使用限制
#### 不支持的特性
- 不支持存储过程。
- 不支持触发器。
- 不支持视图。
- 不支持事件。
- 不支持自定义函数。
- 不支持外键约束、外键关联。

- 不支持全文索引。
- 不支持空间函数，直接下推到DN节点场景下除外。
- 不支持临时表。
- 不支持BEGIN...END、LOOP...END LOOP、REPEAT...UNTIL...END REPEAT、WHILE...DO...END WHILE 等复合语句。

- 不支持类似IF ，WHILE 等流程控制类语句。
- 不支持RESET、FLUSH语句。

- 不支持BINLOG语句。
- 不支持HANDLER语句。

- 不支持INSTALL/UNINSTALL PLUGIN语句。
- 不支持非 ascii/latin1/binary/utf8/utf8mb4 的字符集。

- 不支持SYS schema。

- 不支持MySQL追踪优化器。
- 不支持X-Protocol。

- 不支持CHECKSUM TABLE 语法。
- 不支持表维护语句，包括CHECK/CHECKSUM/OPTIMIZE/REPAIR TABLE。

- 不支持session变量赋值与查询。 例如：
  ```
  set @rowid=0;
  select @rowid:=@rowid+1,id from user;
  ```
  
- 不支持SQL语句中包含单行注释 ' --' 或者多行（块）注释 ' /.../'。

- 不完整支持系统变量查询，系统变量查询语句返回值为RDS实例相关变量值，而非DDM引擎内相关变量值。例如select @@autocommit返回的值，并不代表DDM当前事务状态。
- 不支持SET Syntax修改全局变量。
- 不支持SET SESSION sql_mode修改DN的sql_mode属性，需要去DN的参数管理页面进行修改，修改后在DDM页面做DN同步操作。

- 不支持PARTITION语法，建议不要使用partition表。
- 不支持LOAD XML语句。
- 不支持内联注释语句。
- 不支持CREATE TABLE AS WITH SELECT语法。
- 不支持ZEROFILL CREATE语法。
- 不支持CHAR(... USING BINARY)语法，直接下推到DN节点场景下除外。
- 不支持不合法数据时间，非法时间输出可能导致非预期结果。 例如：
  2023-00-15这类不合法时间，可以正常存储，但读取时被转换成2022-12-15。
  select STR_TO_DATE('2024-06', '%Y-%m') 返回结果为2024-05-31。
  
 
#### 不支持的运算符
- 不支持":="赋值运算符。此运算符可执行，执行时不报错，但执行后不生效。
- 不支持"-\>"运算符。此运算符单表可执行成功，其他类型表执行时报错。
- 不支持"-\>\>"运算符。此运算符单表可执行成功，其他类型表执行时报错。
- 暂不支持"IS UNKNOWN"表达式。
- 不支持需要在DDM计算层进行的JSON类型字段的比较运算：=，\<, \<=, \>, \>=, \<\>, !=, \<=\>。
 
#### 不支持的函数
DDM计算层暂不支持如下函数。如果无法确认函数是否能下推到RDS，请不要使用该函数。
- 不支持XML函数。
- 不支持ANY_VALUE()函数。
- 不支持ROW_COUNT()函数。
- 不支持COMPRESS()函数。
- 不支持SHA()函数。
- 不支持SHA1()函数。
- 不支持AES_ENCRYPT()函数。
- 不支持AES_DECRYPT()函数。
- 不支持JSON_OBJECTAGG()聚合函数。
- 不支持JSON_ARRAYAGG()聚合函数。
- 不支持JSON_CONTAINS()函数。
- 不支持JSON_UNQUOTE()函数。
- 不支持STD()聚合函数。
- 不支持STDDEV()聚合函数。
- 不支持STDDEV_POP()聚合函数。
- 不支持STDDEV_SAMP()聚合函数。
- 不支持VAR_POP()聚合函数。
- 不支持VAR_SAMP()聚合函数。
- 不支持VARIANCE()聚合函数。
- 不支持MICROSECOND()函数。
- 不支持TO_DAYS()函数。
- 不支持TO_SECONDS()函数。
- 不支持UNCOMPRESS()函数。
- 不支持UNCOMPRESSED_LENGTH()函数。
- 不支持UNHEX()函数。
- 不支持YEARWEEK()函数。
- 不支持TIME_FORMAT()函数。
- 不支持GET_FORMAT()函数。
- REPLACE函数不支持隐式转换。
- 不支持FIELD()函数。
 
#### SQL语法使用限制
**SELECT**
- 不支持DISTINCTROW。
- 不支持\[HIGH_PRIORITY\]、\[STRAIGHT_JOIN\]、 \[SQL_SMALL_RESULT\]、 \[SQL_BIG_RESULT\] 、\[SQL_BUFFER_RESULT\] 、\[SQL_NO_CACHE\] \[SQL_CALC_FOUND_ROWS\]等选项放在DDM实例下面。
- 不支持SELECT ... GROUP BY ... WITH ROLLUP语句。
- 不支持SELECT ... ORDER BY ... WITH ROLLUP语句。
- 不支持WITH语句。
- 不支持不同排序规则的联表查询。
- 不支持窗口函数。
- SELECT FOR UPDATE仅支持简单查询，不支持join、group by、order by、limit等语句。用于修饰FOR UPDATE的\[NOWAIT \| SKIP LOCKED\]选项对于DDM无效。
- 对于UNION中的每个SELECT, DDM暂不支持使用多个同名的列。
  例如：如下SQL的SELECT中存在重复的列名。
  ```
  SELECT id, id, name FROM t1 UNION SELECT pk, pk, name FROM t2;
  ```
  
**排序与Limit**
LIMIT/OFFSET参数支持范围为0-2147483647。
**计算**
- 对于多层数学函数嵌套进行数字计算场景，小数点后尾数0值会截断。(例如25.10查询结果是25.1)。
- 不支持固定位数进行前后补0。
**聚合**
不支持group by语句后添加asc或desc函数来实现排序语义。
![](https://support.huaweicloud.com/productdesc-ddm/public_sys-resources/note_3.0-zh-cn.png)
- DDM自动忽略group by后的asc或desc关键字。
- MySQL 8.0.13以下版本支持group by后添加asc或desc函数来实现排序语义，8.0.13及以上版本已废弃该用法，使用时会报语法错误。推荐使用order by语句来保证排序语义。
 
**子查询**
- 不支持与grand parent query产生关联关系的子查询。
- 不支持HAVING子句中的子查询，JOIN ON 条件中的子查询。
- Derived Tables 必须拥有一个别名。
- Derived Tables 不可以成为 Correlated Subqueries，即不能包含子查询外部表的引用。
**LOAD DATA语法限制**
- 不支持LOW_PRIORITY。
- 不支持CONCURRENT。
- 不支持PARTITION (partition_name \[, partition_name\] ...)。
- 不支持LINES STARTING BY 'string'。
- 不支持用户变量。
- ESCAPED BY 只支持'\\\\'。
- 如果导入数据时没有指定自增键的值，DDM不会填充自增值，自增能力使用的是底层DN的自增能力，因此自增值会重复。
- 如果主键或者唯一索引值经过路由后不在同一张物理表，REPLACE不生效。
- 如果主键或者唯一索引值经过路由后不在同一张物理表，IGNORE不生效。
- 不支持对含有全局二级索引的表执行LOAD DATA的操作。
**INSERT 和 REPLACE**
- 不支持INSERT DELAYED...。
- 不支持不包含拆分字段的INSERT。
- 暂不支持PARTITION语法，建议不要使用partition表。
- INSERT操作不支持datetime（YYYY-MM-DD HH:MM:SS）中"YYYY"取值1582年及之前年份。
- INSERT不支持ON DUPLICATE KEY UPDATE 关联子查询列。
  ```
  INSERT INTO t1(a, b)
  SELECT * FROM(SELECT c, d FROM t2 UNION SELECT e, f FROM t3) AS dtest
  ON DUPLICATE KEY UPDATE b = b + c;
  ```
  示例ON DUPLICATE KEY UPDATE语句中引用了子查询列c。
  
- INSERT和REPLACE不支持拆分键值为DEFAULT关键字。
**UPDATE和DELETE**
- 不支持更新拆分键值为DEFAULT的关键字。
- 不支持在一个语句中对同一字段重复更新。
- 不支持关联更新拆分键。
  ```
  UPDATE tbl_1 a, tbl_2 b set a.name=b.name where a.id=b.id;
  ```
  示例中"name"为tbl_1的拆分键。
  
- 不支持通过INSERT ON DUPLICATE KEY UPDATE更新拆分键。
- 不支持自关联更新。
  ```
  UPDATE tbl_1 a, tbl_1 b set a.tinyblob_col=concat(b.tinyblob_col, 'aaabbb');
  ```
  
- 不支持含有JSON类型字段的二级拆分表进行带子查询的拆分键更新。
- 不支持不带关联条件的关联更新。
  不带关联条件的关联更新语句如下：
  ```
  UPDATE tbl_3, tbl_4 SET tbl_3.varchar_col='dsgfdg';
  ```
  
- 关联更新不支持在目标列的赋值语句或表达式中引用其它目标列。
  ```
  UPDATE tbl_1 a, tbl_2 b SET a.name=concat(b.name, 'aaaa'),b.name=concat(a.name, 'bbbb') ON a.id=b.id;
  ```
  
- 对拆分字段的更新，将转换成delete+insert两个阶段操作，操作中间不保证其它涉及到这张表中的拆分字段值的查询语句的一致性。
 
**DDL**
- 库名不可修改，拆分字段的名称和类型都不可以变更。
- 不支持通过SQL直接创建、删除逻辑库。
- 不支持FULL_TEXT索引。
- 不支持 CREATE TABLE tblName AS SELECT stmt 语法。
- 不支持 CREATE TABLE tblName LIKE stmt 语法。
- 不支持单条语句中DROP多张表。
- DDL语句不支持多语句。
- 广播表、拆分表不支持创建外键。
- 不支持创建以"_ddm"为前缀的表。
- 不支持创建TEMPOPARY类型的拆分表、广播表。
- create table中的unique key只能保证物理表内唯一，无法保证全局唯一。
- 不支持修改全局二级索引的字段。
#### 索引
- 不支持全局唯一索引, unique key\\primary key无法保证全局唯一。
- 不支持主键、拆分键等字段值超出数据范围。
- 使用全局二级索引时，需要设置sql_mode=STRICT_TRANS_TABLES。
- 不支持创建索引时指定索引可见性。
- 不支持函数和表达式索引。
 
#### 表回收站
- 不支持hint。
- 不支持按逻辑库清除回收表。
- 不支持按逻辑表清除回收表。
- 表恢复后不保证全局唯一序列无缝衔接递增，只确保递增。
- 数据不支持分片变更。
- 不支持无限期保留副本。
- 不支持恢复到任意表名。
- 不支持不限量副本数。
 
#### 事务
- 不支持Savepoints。
- 不支持XA语法（DDM内部已经通过XA实现了分布式事务，不需要用户层再处理这个语义）。
- 不支持自定义事务隔离级别，目前DDM只支持READ COMMITTED隔离级别。考虑到兼容性因素，对于设置数据库隔离级别的语句（如SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ），DDM不会报错，但会忽略对事务隔离级别的修改。
- 不支持设置事务为只读（START TRANSACTION READ ONLY），考虑到兼容性因素，DDM会将只读事务的开启自动转换为开启读写事务。
 
#### 权限
- 不支持列级权限。
- 不支持子程序层级权限。
 
#### 数据库管理语句
- 不支持SHOW TRIGGERS语法。
- 不支持SHOW PROFILES、SHOW ERRORS、show warnings等多数运维SHOW语句。
- 下列的SHOW指令会随机发到某个物理分片，每个物理分片如果在不同的RDS for MySQL实例上，查得的变量或者表信息可能不同。
  - SHOW TABLE STATUS
  
  - SHOW VARIABLES Syntax
  
  - SHOW WARNINGS Syntax 不支持LIMIT/COUNT的组合
  
  - SHOW ERRORS Syntax 不支持LIMIT/COUNT的组合
   
 
#### INFORMATION_SCHEMA
仅支持SCHEMATA、TABLES、COLUMNS、STATISTICS、PARTITIONS的简单查询（没有子查询、JOIN、聚合函数、ORDER BY、 LIMIT）。
#### 广播表
由于DDM的广播表机制是statement级别广播，如果使用运行结果不确定的函数，会造成广播表每个分片的数据不一致，请不要在广播表场景中使用这些函数。如果SQL中使用了这些函数，需要计算好，再以常量形式运用到广播表的操作中。运行结果不确定的函数包括但不限于以下函数：
- CONNECTION_ID()
- CURDATE()
- CURRENT_DATE()
- CURRENT_TIME()
- CURRENT_TIMESTAMP()
- CURTIME()
- LAST_INSERT_ID()
- LOCALTIME()
- LOCALTIMESTAMP()
- NOW()
- UNIX_TIMESTAMP()
- UTC_DATE()
- UTC_TIME()
- UTC_TIMESTAMP()
- CURRENT_ROLE()
- CURRENT_USER()
- FOUND_ROWS()
- GET_LOCK()
- IS_FREE_LOCK()
- IS_USED_LOCK()
- JSON_TABLE()
- LOAD_FILE()
- MASTER_POS_WAIT()
- RAND()
- RELEASE_ALL_LOCKS()
- RELEASE_LOCK()
- ROW_COUNT()
- SESSION_USER()
- SLEEP()
- SYSDATE()
- SYSTEM_USER()
- USER()
- UUID()
- UUID_SHORT()
 
