DML操作

更新时间:
复制为 MD 格式

表格存储非事务表通过 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. 登录表格存储控制台

  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。