表格存储非事务表通过 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。