DDL 操作

更新时间:
复制为 MD 格式

表格存储的 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 already exists 错误。

table_name

映射表名称,必须与数据表名称相同。

column_name

列名。SQL 中的列名必须和数据表中的列名等效(大小写不敏感),例如数据表中列名为 Aa,SQL 中可使用 AaAAaAaa

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

执行引擎类型。默认为 tablestore,表示 SQL 引擎自动选择合适的索引。

consistency

查询结果一致性。取值 strong(强一致性)或 eventual(最终一致性,默认值)。设为 strong 后,SQL 引擎不会自动选择多元索引(多元索引为最终一致性)。

allow_inaccurate_aggregation

是否允许通过牺牲聚合精度提升查询性能。默认为 true。设为 false 后,SQL 引擎不会自动选择多元索引进行聚合计算。使用多元索引映射表时,此参数固定为 true

示例

为 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

操作类型:ADD COLUMN(添加属性列)或 DROP COLUMN(删除属性列)。

column_name

列名。添加时不能与已有列名重复,列名大小写规则与 CREATE TABLE 一致。

data_type

ADD COLUMN

列的 SQL 数据类型,必须与数据表中对应列的类型匹配。DROP COLUMN 时不需要。

示例

为映射表添加属性列:

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

指定后,映射关系不存在时不报错,静默返回成功。未指定时,映射关系不存在会返回 Unknown mapping table 错误。

示例

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

映射表名称。FROMIN 等效,均可使用。

示例

查询数据表映射关系的索引信息(返回主键、二级索引、多元索引):

SHOW INDEX IN exampletable;

返回结果中,Index_type 列标识索引类型:空值为主键索引,GlobalIndex 为二级索引,SearchIndex 为多元索引。

查询多元索引映射关系的索引信息:

SHOW INDEX IN search_exampletable1;

多元索引映射表的 SHOW INDEX 结果中,主键索引对应 _system_hidden_pk_field(系统隐藏主键),各列额外显示 Search_type(如 LONGKEYWORDTEXT)。

列出映射表

执行 SHOW TABLES 语句列出当前实例中所有映射表的名称。

语法

SHOW TABLES;

返回结果示例:

+------------------------+
| Tables_in_myinstance   |
+------------------------+
| exampletable           |
+------------------------+
| search_exampletable1   |
+------------------------+

常见错误

错误信息

触发语句

原因与解决方案

Table 'instance.table' doesn't exist

CREATE TABLE

数据表不存在。CREATE TABLE 只能为已有的数据表或多元索引创建映射,确认数据表已创建。

Table 'instance.table' already exists

CREATE TABLE

映射关系已存在。如果要忽略此错误,使用 IF NOT EXISTS;如果要重建,先执行 DROP MAPPING TABLE 再创建。

Unknown mapping table 'instance.table'

DROP MAPPING TABLE

映射关系不存在。如果要忽略此错误,使用 IF EXISTS

Unsupported alter non-mapping table

ALTER TABLE

目标表不是通过 CREATE TABLE 创建的映射表(可能是自动绑定的映射表),不支持 ALTER TABLE 操作。