表格存储的 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语句更新属性列。 -
每次仅支持添加或删除一列,多列操作需重复执行。
-
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 |
|
目标表尚未通过 |