DML操作
Table Store非事務表通過 SQL 支援資料寫入、更新和刪除操作,包含 INSERT、UPDATE 和 DELETE 三類語句。
適用範圍
專案 | 說明 |
表類型 | 僅非事務表(即建立時未開啟事務的表) |
支援的 DML 語句 | INSERT、UPDATE、DELETE |
查詢語句 | SELECT 和 SHOW 不受 DML 限制約束,相關用法請參見 SQL 查詢相關文檔 |
部分 DML 文法 | INSERT IGNORE、ON DUPLICATE KEY UPDATE、REPLACE 等僅事務表支援,非事務表不可用 |
前提條件
已建立非事務表。
已通過 CREATE TABLE 語句為表建立 SQL 映射關係。
通過 RAM 子帳號執行 DML 操作時,需要為子帳號授予 SQL_DML 許可權,詳見自訂RAM Policy。
使用方式
非事務表 DML 操作可以通過控制台、SDK 等多種方式執行,本節介紹各入口的基本調用方式。
控制台
在概覽頁面,單擊实例名称。
在实例管理頁面,單擊SQL查詢頁簽。
在 SQL 編輯器中輸入 DML 語句,然後單擊執行SQL。
樣本:插入一行資料。
INSERT INTO my_table VALUES (1, 'value1', 100);SDK
Java
通過 Java SDK 的 SyncClient.sqlQuery() 方法執行 DML 語句。從 SQLQueryResponse 擷取受影響行數(getAffectedRows())和消耗的讀寫 CU(getConsumedCapacity())。
需安裝5.17.11及以上版本的SDK。
SQLQueryRequest request = new SQLQueryRequest("INSERT INTO my_table VALUES (1, 'value1', 100)");
SQLQueryResponse response = client.sqlQuery(request);
long affectedRows = response.getAffectedRows();
Map<String, ConsumedCapacity> consumedCapacity = response.getConsumedCapacity();Go
通過 Go SDK 的 TableStoreClient.SQLQuery() 方法執行 DML 語句。從 SQLQueryResponse 擷取受影響行數(AffectedRows)和消耗的讀寫 CU(SQLQueryConsumed)。
需安裝v1.9.2及以上版本的SDK。
request := &tablestore.SQLQueryRequest{Query: "INSERT INTO my_table VALUES (1, 1, 100, 'hello')"}
response, err := client.SQLQuery(request)
if err != nil {
log.Fatal(err)
}
affectedRows := response.AffectedRows
consumed := response.SQLQueryConsumedINSERT 語句
非事務表 INSERT 語句支援單行插入和同一分區鍵下的多行原子批量插入。主鍵衝突時返回錯誤,不會覆蓋已有資料。
單行插入
INSERT INTO user_table VALUES (1, 'value1', 100);同一分區鍵下的多行批量插入
同一分區鍵下的多行可以原子批量插入,單次最多 200 行。以下樣本假設表結構為 user_table(pk1 BIGINT, pk2 VARCHAR(1024), value BIGINT),其中 pk1 為分區鍵。兩行的分區鍵 pk1 均為 1,屬於同一分區,可原子批量插入。
INSERT INTO user_table VALUES (1, 'attr1', 100), (1, 'attr2', 200);注意事項
主鍵衝突:插入已存在主鍵的行會返回錯誤,錯誤碼為
OTSParameterInvalid,錯誤資訊包含Duplicate entry for key 'PRIMARY',已有資料不會被覆蓋。跨分區鍵批量插入:批量 INSERT 的所有行必須具有相同的分區鍵,跨分區鍵的批量插入會失敗。
單批超過 200 行:單次批量 INSERT 超過 200 行時將被拒絕。
受影響行數:單行 INSERT 成功返回 1,N 行批量插入成功返回 N。主鍵衝突時不返回受影響行數,直接報錯。
UPDATE 語句
非事務表 UPDATE 語句僅支援通過完整主鍵等值條件指定的單行更新,複合主鍵的 WHERE 條件順序可以與主鍵定義順序不同。
常量值更新
支援單列或多列同時更新。
-- 單列更新
UPDATE user_table SET attr_col = 999 WHERE pk_col = 1;
-- 多列更新
UPDATE user_table SET c1 = 10, c2 = 20, c3 = 'updated' WHERE id = 1;
-- 複合主鍵更新,WHERE 條件順序可與主鍵定義順序不同
UPDATE user_table SET value = 999 WHERE pk2 = 2 AND pk1 = 1;自增列更新
對整數類型(BIGINT)的屬性列進行原子性的遞增或遞減操作,適用於計數器等情境。僅支援整數類型屬性列,不支援 DOUBLE、BOOL、VARCHAR 等其他類型。
-- 遞增 1
UPDATE user_table SET counter = counter + 1 WHERE id = 1;
-- 遞增指定值
UPDATE user_table SET counter = counter + 10 WHERE id = 1;
-- 遞減
UPDATE user_table SET counter = counter - 5 WHERE id = 1;將屬性列設為 NULL
將屬性列設為 NULL 等同於刪除該屬性列。系統會將該屬性列從行中移除,而非儲存 NULL 值。
UPDATE user_table SET attr_col = NULL WHERE pk_col = 1;注意事項
WHERE 必須為完整主鍵等值條件:以下情況均不支援,會返回錯誤碼
OTSParameterInvalid或OTSUnsupportOperation:WHERE 子句未包含完整主鍵。
WHERE 子句使用了非主鍵列條件。
WHERE 子句使用了範圍查詢(
>、<、BETWEEN等)。WHERE 子句使用了
IN、LIKE、OR、!=等非等值條件。WHERE 子句在完整主鍵之外附加了屬性列條件。
不能修改主鍵列:UPDATE 不支援通過 SET 修改主鍵列的值。
目標行不存在:UPDATE 不存在的行時操作靜默成功,受影響行數為 0,不報錯。
DELETE 語句
非事務表 DELETE 語句僅支援通過完整主鍵等值條件指定的單行刪除,複合主鍵的 WHERE 條件順序可以與主鍵定義順序不同。
-- 單主鍵刪除
DELETE FROM user_table WHERE pk_col = 1;
-- 字串主鍵刪除
DELETE FROM user_table WHERE id = 'abc';
-- 複合主鍵刪除
DELETE FROM user_table WHERE pk1 = 1 AND pk2 = 1;
-- 複合主鍵刪除,WHERE 條件順序可與主鍵定義順序不同
DELETE FROM user_table WHERE pk2 = 2 AND pk1 = 1;注意事項
WHERE 必須為完整主鍵等值條件:約束與 UPDATE 一致,缺 WHERE、部分主鍵、非主鍵列條件、範圍條件、
IN、LIKE、OR、附加屬性列條件等均不支援。目標行不存在:DELETE 不存在的行時操作靜默成功,受影響行數為 0,不報錯。
使用限制
SQL 文法限制
以下 SQL 文法在非事務表 DML 操作中不支援:
限制項 | 適用操作 | 說明 |
無 WHERE 子句 | UPDATE、DELETE | 必須指定完整主鍵 |
WHERE 使用非主鍵列 | UPDATE、DELETE | 僅支援主鍵列的等值條件 |
WHERE 使用部分主鍵 | UPDATE、DELETE | 複合主鍵必須全部指定 |
範圍條件( | UPDATE、DELETE | 僅支援等值條件 |
| UPDATE、DELETE | 僅支援單值等值匹配 |
| UPDATE、DELETE | 不支援模糊比對 |
| UPDATE、DELETE | 不支援邏輯或 |
| UPDATE、DELETE | 不支援不等條件 |
| UPDATE、DELETE | 不支援屬性列空值判斷 |
主鍵 + 屬性列組合條件 | UPDATE、DELETE | 僅支援純主鍵等值條件 |
ORDER BY | UPDATE、DELETE | 不支援排序 |
LIMIT | UPDATE、DELETE | 不支援行數限制 |
IGNORE 選項 | UPDATE、DELETE | 不支援忽略錯誤 |
優先順序設定(如 HIGH_PRIORITY) | INSERT、UPDATE、DELETE | 不支援 |
多表操作 | UPDATE、DELETE | 不支援跨表操作 |
分區名指定 | INSERT、UPDATE、DELETE | 不支援 |
索引提示 | UPDATE、DELETE | 不支援索引提示 |
INSERT SET 文法 | INSERT | 不支援 |
INSERT ... SELECT | INSERT | 不支援從查詢結果插入 |
INSERT IGNORE | INSERT | 非事務表不支援 |
ON DUPLICATE KEY UPDATE | INSERT | 非事務表不支援 |
REPLACE | INSERT | 不支援 |
更新主鍵列 | UPDATE | 不支援通過 SET 修改主鍵列的值 |
單批 INSERT 行數 | INSERT | 同一分區鍵下單次最多 200 行 |
資料類型限制
資料類型 | 是否可作主鍵 | 限制說明 |
BIGINT | 是 | 不支援 UNSIGNED;主索引值有效範圍為 |
VARCHAR | 是 | 可作為主鍵列 |
VARBINARY | 是 | 可作為主鍵列 |
DOUBLE | 否 | 不可作為主鍵 |
MEDIUMBLOB | 否 | 不可作為主鍵,僅可作為屬性列 |
MEDIUMTEXT | 否 | 不可作為主鍵 |
BOOL / TINYINT(1) | 否 | 長度必須為 1,不可作為主鍵 |
列選項和約束限制
CREATE TABLE 時僅支援以下列選項:PRIMARY KEY、NOT NULL、NULL、DEFAULT VALUE、ON UPDATE。不支援 AUTO_INCREMENT、UNIQUE、CHECK、COMMENT 等列選項。
約束方面,僅支援 PRIMARY KEY 約束,不支援 UNIQUE、FOREIGN KEY、CHECK 等約束。
特殊表類型限制
Search 綁定表和別名表不支援任何 DML 操作(INSERT、UPDATE、DELETE)。
計費說明
非事務表的 INSERT、UPDATE、DELETE 均為單行原子操作。在執行寫入前,系統需要對目標行進行校正(如行是否存在、列值是否發生變化),該校正過程會產生讀 CU。
操作實際寫入:同時產生讀 CU 和寫 CU。
操作未實際寫入(INSERT 主鍵衝突、UPDATE 或 DELETE 目標行不存在、UPDATE 列值未發生變化):僅產生讀 CU,不產生寫 CU。