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 | 支援 |
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 | 支援 |