SQL语法支持
DML语句
在关系集群数据库中,DML语句的逻辑将变的更为复杂。计算节点将DML语句分为两大类:单库DML语句与跨库DML语句。
单库DML语句,指SQL语句只需在一个节点上运行,即可计算出正确结果。假设分片表customer分片字段为provinceid,则下列语句为单库SELECT,因为该条语句只会在provinceid=1所路由的那个节点上运行:
SELECT * FROM customer WHERE provinceid=1;
跨库DML语句,指SQL语句需要多个数据节点的数据,经过计算节点的二次处理,才能整合计算出最终的结果。假设分片表customer分片字段为provinceid,则下面的SELECT语句为跨库语句,因为 id>10的数据可能分布在多个节点,为了整合并排序得出最终结果,需要获取多个节点的数据:
SELECT * FROM customer WHERE id>10 ORDER BY id;
显然,单库的SQL语句要比跨库的SQL语句性能高。在使用计算节点的时候,尽量使用单库的DML语句。
上面的例子,描述的仅仅是简单单表的SELECT单库与跨库查询。那么在JOIN中,需要多个数据节点的数据时,称之为跨库JOIN;只需要单个数据节点的数据时,称之为单库JOIN。
对于子查询语句,需要查询多个数据节点的数据时,称之为跨库子查询;只需要单个数据节点的数据时,称之为单库子查询。
计算节点对单库JOIN的查询支持功能,与单库SELECT语句支持功能一样。
DELETE语句
存储节点5.6.2开始,DELETE语句支持删除指定分区(partition)中的数据。如有表名称t与分区名称p0,下面语句将删除分区p0所有的数据:
DELETE FROM t PARTITION(p0);
单库的DELETE语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
DELETE | PARTITION | 支持 | ||
ORDER BY | 支持 | |||
LIMIT | 支持 | |||
WHERE | dnid | 支持 | 在where条件中指定分片节点 | |
函数 | 支持 | |||
多表DELETE | 支持 | |||
view | 限制支持 | 支持了仅查询字段的单表视图的delete操作 |
跨库的DELETE语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
DELETE | PARTITION | 支持 | ||
ORDER BY DESC | ASC | 支持 | ||
LIMIT | 支持 | |||
ORDER BY … LIMIT … | 支持 | 父子表不支持 | ||
ORDER BY字段值大小写敏感 | 支持 | |||
WHERE | WHERE中的函数 | 支持 | ||
JOIN | 支持 | 含临时表场景不支持 |
INSERT语句
单库INSERT语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
INSERT | INSERT … SELECT … | 支持 | ||
IGNORE | 支持 | |||
PARTITION | 支持 | |||
ON DUPLICATE KEY UPDATE | 支持 | |||
INSERT INTO table_name(columns… ) VALUES(values…) | 支持 | |||
INSERT INTO … VALUES() | 支持 | |||
INSERT INTO … SET | 支持 | |||
分片表无拆分字段值 | 不支持 | |||
分片表拆分字段值为NULL | 支持 | 需要在分片函数参数中配置NULL值参数 | ||
子表无关联字段值 | 不支持 | 子表数据的INSERT操作必须满足外键条件 | ||
子表关联字段值为NULL | 不支持 | 子表数据的INSERT操作必须满足外键条件 | ||
INSERT BATCH | 分片表 | 支持 | ||
全局表 | 支持 | |||
子表 | 条件限制 | 父表的关联字段不是分片字段时不支持。 |
INSERT IGNORE
在计算节点上,当出现主键/唯一键冲突时,将忽略数据与冲突信息。
mysql> create table test(id int not null primary key,provinceid int)engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test set id = 1,provinceid=2;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+------------+
| id | provinceid |
+----+------------+
| 1 | 2 |
+----+------------+
1 row in set (0.00 sec)
mysql> insert ignore into test set id = 1,provinceid=2; --主键id为1的记录已经存在,数据被忽略。
Query OK, 0 rows affected (0.00 sec)
对分片表INSERT IGORE语句的操作,若INSERT语句中,没有给出分片字段与分片字段值,计算节点将根据是否开启全局唯一约束判断是否忽略SQL语句。
例如 test 表为分片表,id 为分片字段
mysql> CREATE TABLE `test2` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,UNIQUE KEY `id` (`id`),UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB;mysql> insert ignore into test2(name) values ('e');
mysql> insert ignore into test2(name) values ('e');
当关闭表全局唯一约束时,插入第2条时,如果id 列1、2 值路由到同一个节点,则第2条SQL 会忽略,若不是同一节点,则第2条会插入成功。
当开启表全局唯一约束时,插入第2条时,如果id 列1、2 值路由到同一个节点,则第2条SQL 会忽略,若不是同一节点,则第2条SQL也会忽略。
INSERT 无分片字段
若INSERT 从句中没有指定分片字段的值时:
若分片字段有default 默认值,默认按照default值路由;
若分片字段没有default 默认值,会填充null , 若null值配置了路由规则即可插入;未配置路由规则则不允许插入(例如range match 这类需要单独配置null 分片规则;auto_crc32 这类,根据null自动路由)。
跨库INSERT语句
在关系集群数据库中,INSERT语句只有在INSERT… SELECT与INSERT BATCH两种情况下,才会产生跨库INSERT语句。
INSERT BATCH指的是单条INSERT语句,写入多行记录的方式:
INSERT INTO ... table_name VALUES(),VALUES(),VALUES();
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
INSERT | INSERT … SELECT … | 支持 | ||
INSERT BATCH | 子表 | 支持 | 父表的JOIN字段不是分片字段时不支持。 | |
全局表 | 支持 | |||
分片表 | 支持 |
批量INSERT (INSERT BATCH)的情况特殊说明:
事务中的批量INSERT,部分成功部分失败,会自动回滚至上一个SAVEPOINT。
LOAD DATA语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
LOAD DATA | LOAD DATA ... INFILE ... INTO TABLE | 支持 | 1. 要求执行语句的计算节点数据库用户拥有FILE权限 | |
2. 当计算节点为集群模式时,无论在集群中哪台服务器上执行此语法,导入文件都必须上传至当前主计算节点服务器上的固定路径:/usr/local/hhdb/hhdb-server/HotDB-TEMP | ||||
LOW_PRIORITY | 不支持 | |||
CONCURRENT | 不支持 | |||
LOCAL | 不支持 | |||
REPLACE | 支持 | |||
IGNORE | 支持 | |||
PARTITION | 不支持 | |||
CHARACTER SET | 不支持 | |||
{FIELDS | COLUMNS} [TERMINATED BY ‘string’] [[OPTIONALLY] ENCLOSED BY ‘char’] [ESCAPED BY ‘char’] | 支持 | |||
LINES STARTING BY ‘string’ | 不支持 | |||
LINES TERMINATED BY ‘string’ | 支持 | |||
导入指定字段 | 支持 | |||
SET | 支持 | |||
IGNORE number {LINES | ROWS} | 支持 |
REPLACE语句
单库REPLACE语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
REPALCE | REPLACE ... SELECT ... | 单库简单单表查询 | 支持 | |
单库JOIN | 支持 | |||
单库子查询 | 支持 | |||
单库UNION/UNION ALL | 支持 | |||
PARTITION | 支持 | |||
ON DUPLICATE KEY UPDATE | 支持 | |||
REPLACE INTO table_name(columns... ) VALUES(values...) | 支持 | |||
REPALCE INTO ... VALUES() | 支持 | |||
REPLACE INTO ... SET | 支持 | |||
分片表无拆分字段值 | 不支持 | |||
分片表拆分字段值为NULL | 支持 | 需要在分片函数参数中配置NULL值参数 | ||
子表无关联字段值 | 不支持 | 子表数据的INSERT操作必须满足外键条件 | ||
子表关联字段值为NULL | 不支持 | 子表数据的INSERT操作必须满足外键条件 | ||
REPLACE BATCH | 分片表 | 支持 | ||
全局表 | 支持 |
跨库REPLACE语句
在关系集群数据库中,REPLACE语句只有在REPLACE … SELECT与REPLACE BATCH两种情况下,才会产生跨库REPLACE语句。
REPLACE BATCH指的是单条REPLACE语句,写入多行记录的方式:
REPLACE INTO ... table_name VALUES(),VALUES(),VALUES();
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
REPLACE | REPLACE ... SELECT ... | 跨库简单单表查询 | 支持 | |
跨库JOIN | 不支持 | |||
跨库UNION | 不支持 | |||
REPLACE BATCH | 子表 | 支持 | 父表的JOIN字段不是分片字段时不支持。 | |
全局表 | 支持 | |||
分片表 | 支持 |
SELECT语句
单库SELECT语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
SELECT | JOIN | LEFT JOIN | 支持 | |
INNER JOIN | 支持 | |||
RIGHT JOIN | 支持 | |||
CROSS JOIN | 支持 | |||
普通JOIN(无JOIN关键字的多表查询) | 支持 | |||
PARTITION分区表 | 支持 | |||
单种表类型的混合JOIN | 支持 | |||
多表类型的混合JOIN | 支持 | |||
子查询 | JOIN | 支持 | ||
IFNULL/NULLIF | 支持 | |||
UNION/UNION ALL | 支持 | |||
IS NULL/IS NOT NULL | 支持 | |||
PARTITION分区表 | 支持 | |||
Select from where表达式 | 支持 | |||
Select select表达式 | 支持 | |||
SELECT FROM SELECT表达式 | 支持 | |||
UNION/UNION ALL | 简单单表查询 | 支持 | ||
JOIN | 支持 | |||
子查询 | 支持 | 同子查询的支持语法相同 | ||
Having聚合函数 | 支持 | |||
PARTITION分区表 | 支持 | |||
DISTINCTROW | 支持 | |||
DISTINCT | 支持 | |||
STRAIGHT_JOIN | 支持 | |||
SQL_NO_CACHE | 支持 | |||
PARTITION | 支持 | |||
WHERE | dnid | 支持 | 1. SET show_dnid=1之后,不支持WHERE 条件带dnid | |
2. dnid与其他条件用or关联,仅取dnid条 | ||||
3. 不支持SELECT子句中跟dnid表达式,例如:SELECT dnid=4 FROM dml_a_jwy | ||||
函数 | 支持 | 请参考函数说明 | ||
GROUP BY ASC | DESC WITH ROLLUP | 支持 | ||
HAVING | 支持 | |||
ORDER BY ASC | DESC | 支持 | ||
LIMIT n,m | 支持 | |||
PROCEDURE | 限制支持 | 支持单库存储过程 | ||
INTO OUTFILE | 支持 | 1. 要求执行语句的计算节点数据库用户拥有FILE权限 | ||
2. 无论在哪台服务器上执行此语法,输出文件都将保存在当前主计算节点服务器上的固定路径:/usr/local/hhdb/hhdb-server/HDB-TEMP | ||||
3. 若输出时集群发生切换,仍能保证数据输出正常 | ||||
INTO DUMPFILE | 不支持 | |||
INTO 变量 | 不支持 | |||
FOR UPDATE | 支持 | 不支持与NOWAIT或SKIP LOCKED连用 | ||
LOCK IN SHARE MODE | 支持 | 与存储节点8.0的FOR SHARE功能相同,为保证向下兼容,仍保留支持 | ||
FOR SHARE | 支持 | 支持在存储节点8.0及以上存储节点使用,不支持与NOWAIT或SKIP LOCKED连用 | ||
函数 | 包括聚合函数 | 支持 | 支持单表聚合函数括号外的复杂运算 | |
DUAL | 支持 | |||
FORCE INDEX | 支持 | |||
USING INDEX | 支持 | |||
IGNORE INDEX | 支持 | |||
RECURSIVE | 支持 | 存储节点8.0版本下,垂直表和全局表支。支持的语法如下:WITH … SELECT …;WITH … UPDATE …(外部sql的语句仅支持垂直表);WITH … DELETE …(外部sql的语句仅支持垂直表);SELECT … WHERE id IN (WITH … SELECT …) …;SELECT * FROM (WITH … SELECT …) AS dt … |
跨库SELECT语句
存储节点语句类型 | 子句类型 | 功能 | 状态 | 说明 |
---|---|---|---|---|
SELECT | LIMIT n,m | 支持 | ||
ORDER BY | 支持 | |||
ORDER BY LIMIT n,m | 支持 | |||
GROUP BY ASC DESC WITH ROLLUP | 支持 | |||
GROUP BY ORDER BY LIMIT m,n | 支持 | |||
GROUP BY/ORDER BY字段值大小写敏感 | 支持 | |||
聚合函数 | SELECT子句中的聚合函数 | 支持 | ||
HAVING子句中的聚合函数 | 支持 | |||
COUNT(DISTINCT) | 支持 | |||
FETCH ROWS | 支持 | |||
FOR UPDATE WAIT | 支持 | |||
DISTINCT | 支持 | |||
ROWNUM | 限制支持 | ROWNUM仅支持以下几种用法: | ||
1.位于SELECT字段中,仅支持单独使用,例如SELECT ROWNUM [as xx] ,xx from table xx,用以对结果各行生成序列号,不允许ROWNUM出现在函数内部,同时不支持ROWNUM和*同时使用 | ||||
2.位于WHERE字段中,仅支持位于WHERE条件最外层,并且是一个’AND’条件的分支, 用以对结果进行数量限制,仅支持“ROWNUM 比较操作符 长整型数 值”同时在一个select子句中仅允许出现一次 | ||||
INTO | 不支持 | |||
WHERE | 函数 | 支持 | ||
PARTITION | 支持 | |||
HAVING | 支持 | |||
PROCEDURE | 限制支持 | 支持单库存储过程 | ||
INTO OUTFILE | 支持 | 1. 要求执行语句的计算节点数据库用户拥有FILE权限。 | ||
2. 当计算节点为集群模式时,无论在集群中哪台服务器上执行此语法,输出文件都将保存在当前主计算节点服务器上的固定路径:/usr/local/hhdb/hhdb-server/HotDB-TEMP | ||||
3. 若输出时集群发生切换,仍能保证数据输出正常。 | ||||
INTO DUMPFILE | 不支持 | |||
INTO 变量 | 不支持 | |||
FOR UPDATE | 支持 | |||
LOCK IN SHARE MODE | 支持 | |||
FORCE INDEX | 支持 | |||
USING INDEX | 支持 | |||
IGNORE INDEX | 支持 | |||
STRAIGHT_JOIN | 支持 | |||
OIN | 限制支持 | 请参考跨库JOIN; | ||
子查询 | JOIN | 支持 | ||
IFNULL/NULLIF | 支持 | |||
UNION/UNION ALL | 支持 | |||
IS NULL /IS NOT NULL | 支持 | |||
PARTITION分区表 | 支持 | |||
AVG/SUM/MIN/MAX函数 | 支持 | |||
横向派生表 | 不支持 | 存储节点8.0新功能 | ||
UNION/UNION ALL | join | 支持 |
UPDATE语句
单库UPDATE语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
UPDATE | LOW_PRIORITY | 支持 | ||
IGNORE | 支持 | |||
ORDER BY | 支持 | |||
LIMIT n | 支持 | |||
SET | 支持 | 1.允许更新分片字段,但要求分片字段值的变更不会影响数据路由,即修改后的分片字段值与修改前的值路由到相同节点,否则执行不成功 | ||
2.父子表不允许使用表达式语法更新父子表的关联字段,即使分片字段值的变更不会影响数据路由,例如SET id=id或SET id=id+3 | ||||
3.不支持一条语句多次更新分片字段,例如:UPDATE table1 SET id =31,id=41 WHERE id =1; | ||||
WHERE | dnid | 支持 | DML WHERE条件里dnid作为OR条件时,仅判断dnid条件,其他限制条件忽略 | |
函数 | 支持 | |||
函数 | 支持 | |||
多表关联 | 支持 | |||
View | 限制支持 | 支持了仅查询字段的单表视图的update操作 |
跨库UPDATE语句
存储节点语句类型 | 子句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
UPDATE | ORDER BY DESC | ASC | 支持 | |
LIMIT n | 支持 | |||
ORDER BY DESC | ASC LIMIT n,m | 支持 | ||
ORDER BY字段值大小写敏感 | 支持 | |||
WHERE | 支持 | |||
SET | 支持 | 1.允许更新分片字段,但要求分片字段值的变更不会影响数据路由,即修改后的分片字段值与修改前的值路由到相同节点,否则执行不成功 | ||
2.父子表不允许使用表达式语法更新父子表关联字段,即使关联字段值的变更不会影响数据路由,例如SET id=id或SET id=id+3 | ||||
3. 不支持一条语句多次更新分片字段,例如:UPDATE table1 SET id =31,id=41 WHERE id =1; | ||||
子句中的函数 | 支持 | |||
WHERE中的函数 | 支持 | |||
PARTITION | 支持 | |||
JOIN | 支持 |
跨库JOIN
一级功能 | 二级功能 | 三级功能 | 支持状态 | 说明 | |
---|---|---|---|---|---|
INNER/LEFT JON | UNION ALL | 支持 | |||
UNION | 支持 | ||||
HAVING | 无条件字段 | 不支持 | SELECT子句必须包含HAVING过滤字段 | ||
COUNT(*) | 支持 | ||||
AVG() | 支持 | ||||
MAX() | 支持 | ||||
MIN() | 支持 | ||||
SUM() | 支持 | ||||
别名 | 支持 | ||||
ORDER BY | 单字段 | 支持 | |||
多字段相同顺序 | 支持 | order by column_name1 desc, column_name2 desc | |||
多字段不同顺序 | 支持 | order by column_name1 desc, column_name2 asc | |||
字段别名 | 支持 | 别名不能与表中的字段名称相同 | |||
字段值大小写敏感 | 支持 | ||||
ENUM类型 | 支持 | ||||
函数 | 支持 | ||||
OR | 支持 | ||||
WHERE | 不同字段的OR条件 | 支持 | |||
单个字段的or条件 | 支持 | ||||
不支持的部分使用NDB且满足NDB限制的支持 | |||||
IN | 支持 | ||||
AND | 支持 | ||||
IS NOT NULL | 支持 | ||||
IS NULL | 支持 | ||||
BETWEEN … AND … | 支持 | ||||
>、>= 、< 、<= | 支持 | ||||
NOW()等常量表达式 | 支持 | column1 > NOW() 或 column1 > DATE_ADD(NOW(), INTERVAL +3 day ) | |||
运算表达式 | 支持 | ||||
LIKE | 支持 | ||||
GROUP BY | 单字段 | 支持 | |||
多字段 | 支持 | ||||
ORDER BY NULL | 支持 | ||||
WITH ROLLUP | 支持 | ||||
字段别名 | 支持 | 别名不能与表名中的字段名称相同 | |||
字段值大小写 | 支持 | ||||
FORCE INDEX | 支持 | ||||
USING INDEX | 支持 | ||||
IGNORE INDEX | 支持 | ||||
AVG | AVG() | 支持 | |||
AVG(IFNULL()) | 支持 | ||||
AVG(column1-column2) | 支持 | ||||
COUNT | COUNT() | 支持 | |||
COUNT DISTINCT | 支持 | ||||
COUNT(*) | 支持 | ||||
COUNT(1) | 支持 | ||||
MIN | MIN() | 支持 | |||
MAX | MAX() | 支持 | |||
SUM | SUM() | 支持 | |||
SUM(CASE … WHEN…) | 支持 | ||||
SUM(IFNULL()) | 支持 | ||||
SUM(column1-column2) | 支持 | ||||
INTO OUTFILE | 支持 | 1. 要求执行语句的计算节点数据库用户拥有FILE权限 | |||
2. 无论在集群中哪台服务器上执行此语法,输出文件都将保存在当前主计算节点服务器上的固定路径:/usr/local/hhdb/hhdb-server/HotDB-TEMP | |||||
3. 若输出时集群发生切换,仍能保证数据输出正常 | |||||
FOR UPDATE | 不支持 | ||||
LOCK IN SHARE MODE | 不支持 | ||||
子查询 | 支持 | ||||
表别名 | 支持 | 支持使用表别名WHERE a.column或者SELECT a.column | |||
ON子句 | 单个= | 支持 | |||
<=> | 支持 | ||||
!= <> | 支持 | ||||
>= > <= < | 支持 | ||||
多个>= > <= <条件 | 支持 | ||||
多个 and = 条件 | 支持 | ||||
IN | 支持 | ||||
IS NOT NULL | 支持 | ||||
IS NULL | 支持 | ||||
BETWEEN … AND … | 支持 | ||||
LIKE | 支持 | ||||
or条件 | 支持 | ||||
数学表达式 | 支持 | ||||
SELECT子句 | 显示空列 | 支持 | SELECT ‘’ AS A FROM … 查询结果中能正确显示空列 | ||
STRAIGHT_JOIN | 支持 | ||||
函数 | UNIX_TIMESTAMP() | 支持 | |||
NOW() | 支持 | ||||
DATE_FORMAT() | 支持 | ||||
DATE_ADD() | 支持 | ||||
DATEDIFF() | 支持 | ||||
FROM_UNIXTIME() | 支持 | ||||
CONVERT | 支持 | ||||
SUBSTRING_INDEX() | 支持 | ||||
SUBSTRING() | 支持 | ||||
TRIM() | 支持 | ||||
RTRIM() | 支持 | ||||
LTRIM() | 支持 | ||||
UCASE() | 支持 | ||||
UPPER() | 支持 | ||||
FLOOR() | 支持 | ||||
% 或 MOD | 支持 | ||||
RAND() | 支持 | ||||
TRUNCATE() | 支持 | ||||
/ 或 DIV | 支持 | ||||
ABS() | 支持 | ||||
LENGTH() | 支持 | ||||
CONCAT() | 支持 | ||||
CAST() | 支持 | ||||
IF() | 支持 | ||||
IFNULL | 支持 | ||||
CASE…WHEN…END | 支持 | ||||
DISTINCT | 支持 | ||||
USING(column) | 支持 | ||||
PARTITION | 支持 | ||||
LIMIT | LIMIT n,m | 支持 | |||
LIMIT n | 支持 | ||||
多表(三表及以上)查询 | 单种LEFT JOIN | 支持 | |||
单种INNER JION | 支持 | ||||
单种NATURAL JOIN | 支持 | ||||
混合的LEFT/INNER JOIN/RIGHT JOIN | 支持 | ||||
混合的LEFT/INNER/NATURAL JOIN | 支持 | ||||
TABLE a … JOIN (TABLE b,TABLE c) … | 支持 | ||||
NATURAL JOIN | 支持 | ||||
不同节点的表JOIN | 支持 | ||||
JOIN | UPDATE … JOIN | 支持 | |||
DELETE … JOIN | 支持 |
DDL语句
ALTER语句
存储节点语句类型 | 子句类型 | 支持状态 | 说明 |
---|---|---|---|
ALTER TABLE | ADD COLUMN | 支持 | |
ADD PRIMARY KEY/UNIQUE/FOREIGN KEY/FULLTEXT/INDEX/KEY | 支持 | 支持ADD UNIQUE [index_name][index_type]index_col_name | |
父子表的ADD FOREIGN KEY | 限制支持 | 非分片字段作为外键关联字段时,无法跨节点保证父子表数据关联性。 | |
即在存储节点中,若父表与子表的外键值相等,则可匹配后插入数据,当非分片字段作为外键关联字段时,由于子表外键关联字段路由的节点与父表分片字段的路由节点不一致,导致子表最终路由的存储节点中找不到父表所对应的外键值,故插入失败:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails | |||
ADD SPATIAL [INDEX | KEY] | 支持 | |
ADD CONSTRAINT [CONSTRAINT [symbol]] PRIMARY KEY/UNIQUE KEY/FOREIGN KEY | 支持 | ||
父子表的ADD CONSTRAINT [CONSTRAINT [symbol]] FOREIGN KEY | 限制支持 | 非字段作为外键关联字段时,无法跨节点保证父子表数据关联性。即在存储节点中,若父表与子表的外键值相等,则可匹配后插入数据,但当非关联字段作为外键关联字段时,由于子表外键关联字段路由的节点与父表分片字段的路由节点不一致,导致子表最终路由的存储节点中找不到父表所对应的外键值,故插入失败:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails | |
ALGORITHM | 支持 | 存储节点8.0新增INSTANT,且默认使用INSTANT | |
ALTER COLUMN | 支持 | ||
LOCK | 支持 | ||
MODIFY/CHANGE [COLUMN] | 支持 | ||
DROP COLUMN | 支持 | ||
DROP PRIMARY KEY/KEY/INDEX/FOREIGN KEY | 支持 | ||
DISABLE KEYS | 支持 | ||
ENABLE KEYS | 支持 | ||
DISCARD TABLESPACE | 不支持 | ||
IMPORT TABLESPACE | 不支持 | ||
ADD/DROP/TRUNCATE PARTITION | 支持 | ||
GENERATED COLUMNS | 支持 | 存储节点8.0与5.7新增功能 | |
SECONDARY INDEXES | 支持 | 存储节点8.0与5.7新增功能 | |
CHECK | 支持 | 存储节点8.0新增功能 | |
ALTER | VIEW | 支持 | |
ALTER | EVENT | 限制支持 | |
ALTER | USER | 支持 |
CREATE语句
存储节点语句类型 | 子句类型 | 支持状态 | 说明 |
---|---|---|---|
CREATE DATABASE | 支持 | 可支持直接创建逻辑库,功能使用说明可见表格下方补充描述。 | |
CREATE EVENT | 限制支持 | 垂直库场景下支持;不支持跨逻辑库的event;创建的event用户默认为存储节点的连接用户;未use库,create/alter/drop event均不支持 | |
CREATE FUNCTION | 限制支持 | 单库场景下可支持 | |
CREATE INDEX | FOREIGN KEY | 支持 | |
UNIQUE | 支持 | ||
父子表的FOREIGN KEY | 限制支持 | 非分片字段作为外键关联字段时,无法跨节点保证父子表数据关联性。即在存储节点中,若父表与子表的外键值相等,则可匹配后插入数据,但当非关联字段作为外键关联字段时,由于子表外键关联字段路由的节点与父表分片字段的路由节点不一致,导致子表最终路由的存储节点中找不到父表所对应的外键值,故插入失败:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails | |
FULLTEXT | 支持 | ||
SPATIAL | 支持 | ||
ALGORITHM | 支持 | ||
LOCK | 支持 | ||
FUNCTIONAL KEYS | 支持 | 存储节点8.0新增功能 | |
CREATE TABLE | CREATE TEMPORARY TABLE | 禁用 | |
CREATE TABLE [IF NOT EXISTS] | 支持 | ||
CREATE TABLE LIKE | 支持 | ||
CREATE TABLE AS SELECT … | 支持 | 1. 要求存储节点用户拥有CREATE TEMPORARY TABLE权限。 | |
2. 要求CREATE的表和SELECT的表关联至少一个相同的数据节点,否则执行不成功:ERROR 10215 (HY000): [LOADTEST1] no overlapping datanode | |||
3. 不支持CREATE TABLE … IGNORE SELECT和CREATE TABLE … REPLACE SELECT | |||
GENERATED COLUMNS | 支持 | 存储节点8.0与5.7新增功能 | |
SECONDARY INDEXES | 支持 | 存储节点8.0与5.7新增功能 | |
CHECK | 支持 | 存储节点8.0新增功能 | |
CREATE TRIGGER | 支持 | 目前仅支持单库,且需要赋予CREATE权限,内部语句不验证权限,DEFINER相关目前不支持,show trrigers时相关字段显示当前用户 | |
CREATE VIEW | 支持 | ||
CREATE USER | 支持 | ||
CREATE ROLE | 支持 |
CREATE DATABASE 在计算节点使用时对应为创建逻辑库的功能,语法使用说明如下:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_option] ... [DEFAULT DATANODE 'datanodeid']
说明:
create_option: [DEFAULT] { CHARACTER SET [=] charset_name |
COLLATE [=] collation_name } ```[DEFAULT DATANODE
‘datanodeid’]可以指定默认分片节点。当不单独指定时,默认关联所有数据节点;当指定时,按指定数据节点关联成逻辑库默认分片节点;当指定的datanodeid不存在时,提示:datanodeid
not exists。
服务端创建逻辑库语法示例:
create database if not exists zjj_d3 default datanode '1,4';
关联不存在的数据节点:
DROP语句
存储节点语句类型 | 子句类型 | 支持状态 | 说明 |
---|---|---|---|
DROP DATABASE | 支持 | 支持直接删除逻辑库,功能使用说明可见表格下方补充描述。 | |
DROP EVENT | 限制支持 | 垂直库场景下支持 | |
DROP FUNCTION | 禁用 | ||
DROP INDEX | UNIQUE | 支持 | |
普通索引KEY | 支持 | ||
FOREIGN KEY | 支持 | ||
FULLTEXT | 支持 | ||
SPATIAL | 支持 | ||
ALGORITHM | 支持 | ||
LOCK | 支持 | ||
DROP TABLE | DROP [TEMPORARY] TABLE [IF EXISTS] | 禁用 | |
DROP TABLE | 支持 | ||
DROP TABLE多表 | 支持 | 必须保证多表在相同节点 | |
DROP TABLE table_name [RESTRICT | CASCADE] | 支持 | |
DROP TRIGGER | 支持 | 需要赋予DROP权限 | |
DROP VIEW | 支持 | ||
DROP USER | 支持 | ||
DROP ROLE | 支持 |
DROP DATABASE在计算节点使用时对应为删除逻辑库的功能,语法使用说明如下:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
说明:
db_name为计算节点逻辑库名称;
server.xml新增参数enableDropDatabase,0为关闭,1为开启,默认值0;
当设置参数1时,可执行DROP {DATABASE | SCHEMA} [IF EXISTS] db_name语句,删除逻辑库时,若库中有表也会一起删除。
当设置参数0时,只允许删除空库,若库中有表则删除库失败。
服务端删除逻辑库语法示例:
drop database if exists test_db;
设置enableDropDatabase=0,库中有表时提示:
设置enableDropDatabase=0且同时开启回收站功能,删除库中表后再删除库时提示:
设置enableDropDatabase=1,库中有表或开启回收站后删除表,均可以成功删除库:
TRUNCATE与RENAME语句
存储节点语句类型 | 子句类型 | 支持状态 | 说明 |
---|---|---|---|
RENAME TABLE | 支持 | 1. 支持RENAME多张表,但要求这些表都在相同节点,否则将执行失败并报错:ERROR 10042 (HY000): unsupported to rename multi table with different datanodes | |
2. RENAME中的目标表不需要提前添加表配置,若添加新表的表配置,需要保证新表表配置与原表一致,否则RENAME将不成功 | |||
注意:计算节点数据库用户需要对旧表拥有ALTER和DROP权限,以及对新表拥有CREATE和INSERT权限 | |||
TRUNCATE TABLE | 支持 |