Table Store的 DDL 操作用於為已有資料表或多元索引建立 SQL 映射關係,以及管理映射表的結構和元資訊。
DDL 語句概覽
語句 | 引擎 | 說明 |
CREATE TABLE | tablestore | 為資料表建立映射關係,SQL 引擎自動選擇合適的索引執行查詢 |
CREATE TABLE | searchindex | 為多元索引建立映射關係,SQL 引擎通過指定的多元索引執行查詢 |
ALTER TABLE | - | 為已有映射表添加或刪除屬性列 |
DROP MAPPING TABLE | - | 刪除映射關係(不影響底層資料表或索引) |
DESCRIBE | - | 查詢映射表的欄位名稱、欄位類型、主鍵等描述資訊 |
SHOW INDEX | - | 查詢映射表關聯的索引資訊(主鍵、二級索引、多元索引) |
SHOW TABLES | - | 列出當前執行個體中所有映射表的名稱 |
與傳統關係型資料庫不同,Table Store的 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 |
| 目標表不是通過 |