表格存储的 DDL 操作用于为已有数据表或多元索引创建 SQL 映射关系,以及管理映射表的结构和元信息。
DDL 语句概览
语句 | 引擎 | 说明 |
CREATE TABLE | tablestore | 为数据表创建映射关系,SQL 引擎自动选择合适的索引执行查询 |
CREATE TABLE | searchindex | 为多元索引创建映射关系,SQL 引擎通过指定的多元索引执行查询 |
ALTER TABLE | - | 为已有映射表添加或删除属性列 |
DROP MAPPING TABLE | - | 删除映射关系(不影响底层数据表或索引) |
DESCRIBE | - | 查询映射表的字段名称、字段类型、主键等描述信息 |
SHOW INDEX | - | 查询映射表关联的索引信息(主键、二级索引、多元索引) |
SHOW TABLES | - | 列出当前实例中所有映射表的名称 |
与传统关系型数据库不同,表格存储的 CREATE TABLE 不创建物理表,而是为已有的数据表或多元索引建立 SQL 访问映射。DROP MAPPING TABLE 只删除映射关系,不影响底层数据。
创建数据表映射关系
执行 CREATE TABLE 语句,使用 ENGINE='tablestore' 为已有数据表创建映射关系。创建后,SQL 引擎自动选择合适的索引(数据表主键、二级索引或多元索引)执行查询。
语法
CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type [NOT NULL | NULL], ...
PRIMARY KEY(key_part [, key_part])
)
ENGINE='tablestore',
ENGINE_ATTRIBUTE='{"consistency": consistency [,"allow_inaccurate_aggregation": allow_inaccurate_aggregation]}';当表只有一个主键时,也可以将 PRIMARY KEY 直接标注在列定义上:
CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type PRIMARY KEY,
column_name data_type [NOT NULL | NULL], ...
)
ENGINE='tablestore',
ENGINE_ATTRIBUTE='{"consistency": consistency}';参数
参数 | 是否必选 | 说明 |
IF NOT EXISTS | 否 | 指定后,映射表已存在时不报错,静默返回成功。未指定时,映射表已存在会返回 |
table_name | 是 | 映射表名称,必须与数据表名称相同。 |
column_name | 是 | 列名。SQL 中的列名必须和数据表中的列名等效(大小写不敏感),例如数据表中列名为 |
data_type | 是 | 列的 SQL 数据类型,必须与数据表中列的数据类型匹配。主键列仅支持 BIGINT、VARCHAR(1024) 和 VARBINARY(1024),属性列额外支持 DOUBLE、BOOL、MEDIUMTEXT 和 MEDIUMBLOB,详细映射见SQL数据类型映射。 |
NOT NULL \ NULL | 否 | 列值是否允许为 NULL。主键列默认 NOT NULL,属性列默认 NULL。当某属性列值不能为 NULL 时,指定该列为 NOT NULL。 |
PRIMARY KEY | 是 | 主键定义,必须与数据表的主键列一致(顺序和类型)。 |
ENGINE | 否 | 执行引擎类型。默认为 |
consistency | 否 | 查询结果一致性。取值 |
allow_inaccurate_aggregation | 否 | 是否允许通过牺牲聚合精度提升查询性能。默认为 |
示例
为 exampletable 创建映射关系,包含主键列 colvalue(VARCHAR)和 id(BIGINT),以及属性列 content(MEDIUMTEXT):
CREATE TABLE exampletable(colvalue VARCHAR(1024), id BIGINT, content MEDIUMTEXT, PRIMARY KEY(colvalue, id)) ENGINE='tablestore';创建强一致性查询的映射关系:
CREATE TABLE exampletable2(id BIGINT(20), colvalue VARCHAR(1024), content MEDIUMTEXT, PRIMARY KEY(colvalue, id)) ENGINE_ATTRIBUTE='{"consistency": "strong"}';创建多元索引映射关系
执行 CREATE TABLE 语句,使用 ENGINE='searchindex' 为已有多元索引创建映射关系。创建后,SQL 引擎通过指定的多元索引执行查询。
适用场景
需要使用多元索引的特有查询能力(如全文检索、向量检索、嵌套类型查询等)。
需要固定查询路由,确保每次查询都使用指定的多元索引,而非由 SQL 引擎自动选择。
语法
CREATE TABLE [IF NOT EXISTS] user_defined_name(
column_name data_type [, column_name data_type]
)
ENGINE='searchindex',
ENGINE_ATTRIBUTE='{"index_name": index_name, "table_name": table_name}';参数
参数 | 是否必选 | 说明 |
IF NOT EXISTS | 否 | 指定后,映射表已存在时不报错,静默返回成功。 |
user_defined_name | 是 | 自定义映射表名称,无需与数据表或索引名相同。 |
column_name | 是 | 列名,无需定义主键。多元索引映射表不支持 VARCHAR 类型,字符串类型的列统一使用 MEDIUMTEXT。 |
index_name | 是 | 多元索引名称。在 ENGINE_ATTRIBUTE 中配置,必须指向已有的多元索引。 |
table_name | 是 | 多元索引所属的数据表名称。在 ENGINE_ATTRIBUTE 中配置。 |
示例
为 exampletable1 数据表的多元索引 exampletable1_index 创建映射表 search_exampletable1:
CREATE TABLE search_exampletable1(id BIGINT, colvalue MEDIUMTEXT, content MEDIUMTEXT) ENGINE='searchindex' ENGINE_ATTRIBUTE='{"index_name": "exampletable1_index", "table_name": "exampletable1"}';使用 IF NOT EXISTS 避免重复创建报错:
CREATE TABLE IF NOT EXISTS search_exampletable1(id BIGINT, colvalue MEDIUMTEXT, content MEDIUMTEXT) ENGINE='searchindex' ENGINE_ATTRIBUTE='{"index_name": "exampletable1_index", "table_name": "exampletable1"}';更新映射表属性列
执行 ALTER TABLE 语句为已有映射表添加或删除属性列。
只有通过
CREATE TABLE语句创建的映射表才支持ALTER TABLE,通过DESCRIBE等操作自动绑定的映射表不支持。每次仅支持添加或删除一列,多列操作需重复执行。
ALTER TABLE只更新映射表的 Schema,不影响数据表的存储结构。不支持添加或删除主键列。
执行后 SQL 引擎异步刷新,最多 30 秒完成。刷新期间查询可能不返回新列。
语法
ALTER TABLE table_name option column_name [data_type];参数
参数 | 是否必选 | 说明 |
table_name | 是 | 映射表名称。 |
option | 是 | 操作类型: |
column_name | 是 | 列名。添加时不能与已有列名重复,列名大小写规则与 |
data_type | 仅 | 列的 SQL 数据类型,必须与数据表中对应列的类型匹配。 |
示例
为映射表添加属性列:
ALTER TABLE exampletable ADD COLUMN colvalue BIGINT;
ALTER TABLE exampletable ADD COLUMN content MEDIUMTEXT;删除映射表的属性列:
ALTER TABLE exampletable DROP COLUMN colvalue;删除映射关系
执行 DROP MAPPING TABLE 语句删除映射关系。支持同时删除多个映射关系。
DROP MAPPING TABLE 只删除映射关系,底层的数据表和数据不受影响。
语法
DROP MAPPING TABLE [IF EXISTS] table_name, ...;参数
参数 | 是否必选 | 说明 |
table_name | 是 | 映射表名称,多个表名用半角逗号(,)分隔。 |
IF EXISTS | 否 | 指定后,映射关系不存在时不报错,静默返回成功。未指定时,映射关系不存在会返回 |
示例
DROP MAPPING TABLE IF EXISTS exampletable;查询表的描述信息
执行 DESCRIBE 语句查询映射表的字段名称、字段类型、是否可为空、是否为主键等描述信息。
语法
DESCRIBE table_name;参数
参数 | 是否必选 | 说明 |
table_name | 是 | 映射表名称。 |
示例
查询 exampletable 映射表的描述信息:
DESCRIBE exampletable;返回结果包含以下列:
返回列 | 示例值 | 说明 |
Field | pk1 | 字段名称 |
Type | varchar(1024) | 字段的 SQL 数据类型 |
Null | NO | 是否允许为空。主键列为 NO,属性列为 YES |
Key | PRI | 主键标识。PRI 表示主键列,空值表示属性列 |
查询索引描述信息
执行 SHOW INDEX 语句查询映射表关联的索引信息,包括主键索引、二级索引和多元索引。
语法
SHOW INDEX {FROM | IN} table_name;参数
参数 | 是否必选 | 说明 |
table_name | 是 | 映射表名称。 |
示例
查询数据表映射关系的索引信息(返回主键、二级索引、多元索引):
SHOW INDEX IN exampletable;返回结果中,Index_type 列标识索引类型:空值为主键索引,GlobalIndex 为二级索引,SearchIndex 为多元索引。
查询多元索引映射关系的索引信息:
SHOW INDEX IN search_exampletable1;多元索引映射表的 SHOW INDEX 结果中,主键索引对应 _system_hidden_pk_field(系统隐藏主键),各列额外显示 Search_type(如 LONG、KEYWORD、TEXT)。
列出映射表
执行 SHOW TABLES 语句列出当前实例中所有映射表的名称。
语法
SHOW TABLES;返回结果示例:
+------------------------+
| Tables_in_myinstance |
+------------------------+
| exampletable |
+------------------------+
| search_exampletable1 |
+------------------------+常见错误
错误信息 | 触发语句 | 原因与解决方案 |
Table 'instance.table' doesn't exist |
| 数据表不存在。 |
Table 'instance.table' already exists |
| 映射关系已存在。如果要忽略此错误,使用 |
Unknown mapping table 'instance.table' |
| 映射关系不存在。如果要忽略此错误,使用 |
Unsupported alter non-mapping table |
| 目标表不是通过 |