DML操作

更新時間:
Copy as MD

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 等多種方式執行,本節介紹各入口的基本調用方式。

控制台

  1. 登入Table Store控制台

  2. 概覽頁面,單擊实例名称

  3. 实例管理頁面,單擊SQL查詢頁簽。

  4. 在 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.SQLQueryConsumed

INSERT 語句

非事務表 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 必須為完整主鍵等值條件:以下情況均不支援,會返回錯誤碼 OTSParameterInvalidOTSUnsupportOperation

    • WHERE 子句未包含完整主鍵。

    • WHERE 子句使用了非主鍵列條件。

    • WHERE 子句使用了範圍查詢(><BETWEEN 等)。

    • WHERE 子句使用了 INLIKEOR!= 等非等值條件。

    • 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、部分主鍵、非主鍵列條件、範圍條件、INLIKEOR、附加屬性列條件等均不支援。

  • 目標行不存在:DELETE 不存在的行時操作靜默成功,受影響行數為 0,不報錯。

使用限制

SQL 文法限制

以下 SQL 文法在非事務表 DML 操作中不支援:

限制項

適用操作

說明

無 WHERE 子句

UPDATE、DELETE

必須指定完整主鍵

WHERE 使用非主鍵列

UPDATE、DELETE

僅支援主鍵列的等值條件

WHERE 使用部分主鍵

UPDATE、DELETE

複合主鍵必須全部指定

範圍條件(><=BETWEEN

UPDATE、DELETE

僅支援等值條件

IN 子句(多值)

UPDATE、DELETE

僅支援單值等值匹配

LIKE 條件

UPDATE、DELETE

不支援模糊比對

OR 條件

UPDATE、DELETE

不支援邏輯或

!= 條件

UPDATE、DELETE

不支援不等條件

IS NULL 條件(屬性列)

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 INTO t SET col=val

INSERT ... SELECT

INSERT

不支援從查詢結果插入

INSERT IGNORE

INSERT

非事務表不支援

ON DUPLICATE KEY UPDATE

INSERT

非事務表不支援

REPLACE

INSERT

不支援

更新主鍵列

UPDATE

不支援通過 SET 修改主鍵列的值

單批 INSERT 行數

INSERT

同一分區鍵下單次最多 200 行

資料類型限制

資料類型

是否可作主鍵

限制說明

BIGINT

不支援 UNSIGNED;主索引值有效範圍為 -9223372036854775808 ~ 9223372036854775806(即 [-2^63, 2^63 - 2]Long.MAX_VALUE 為系統保留值,不可使用)

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。