AnalyticDB for MySQL支援通過ALTER TABLE修改表結構,包括修改表名、列名、列類型、普通索引、叢集索引、外鍵索引、分區函數的格式、冷熱階層式存放區策略。本文介紹ALTER TABLE文法。
文法
ALTER TABLE table_name
{ ADD [COLUMN] column_name column_definition
| ADD [COLUMN] (column_name column_definition,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)
| ADD {INDEX|KEY} [index_name] (column_name)
| ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
| ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
| ADD CLUSTERED [INDEX|KEY] [index_name] (column_name [ASC|DESC])
| ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
| ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
| COMMENT 'comment'
| DROP CLUSTERED KEY index_name
| DROP [COLUMN] column_name
| DROP FOREIGN KEY symbol
| DROP FULLTEXT INDEX index_name
| DROP {INDEX|KEY} index_name
| DROP PARTITION (partition_name,...)
| MODIFY [COLUMN] column_name column_definition
| RENAME COLUMN column_name TO new_column_name
| RENAME new_table_name
| INDEX_ALL = {'Y'|'N'}
| storage_policy
| PARTITION BY VALUE{(column_name)|(DATE_FORMAT(column_name, 'format'))|(FROM_UNIXTIME(column_name, 'format'))} LIFECYCLE N
}
column_definition:
column_type [column_attributes][column_constraints][COMMENT 'comment']
column_attributes:
[DEFAULT{constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT]
column_constraints:
[NULL|NOT NULL]
storage_policy:
STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}本文所有樣本(JSON索引樣本、外鍵索引樣本、向量索引樣本除外)均基於CREATE TABLE文檔中建立的customer表。如果您已建立customer表,可直接執行本文樣本。如果還未建立,請先複製以下建表語句建立customer表。
表
變更表名
文法
ALTER TABLE db_name.table_name RENAME new_table_name樣本
將customer表更名為new_customer。
ALTER TABLE customer RENAME new_customer;變更表的COMMENT
文法
ALTER TABLE db_name.table_name COMMENT 'comment'樣本
將customer表的Comment變更為顧客表。
ALTER TABLE customer COMMENT '顧客表';;列
增加列
文法
ALTER TABLE db_name.table_name ADD [COLUMN]
{column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment']
| (column column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}注意事項
不支援增加主鍵列。
樣本
在
customer表中增加一列province,資料類型為VARCHAR。
ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT '省份';在
customer表中增加兩列,一列為vip,資料類型為Boolean,另一列為tags,資料類型為VARCHAR。
ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT '是否會員',tags VARCHAR DEFAULT '無' COMMENT '標籤');刪除列
文法
ALTER TABLE db_name.table_name DROP [COLUMN] column_name注意事項
不支援刪除主鍵列。
樣本
在customer表中刪除類型為VARCHAR的province列。
ALTER TABLE adb_demo.customer DROP COLUMN province;變更列名
文法
ALTER TABLE db_name.table_name RENAME COLUMN column_name to new_column_name注意事項
不支援更改主鍵列的列名。
樣本
將customer表中的city_name列更名為city。
ALTER TABLE customer RENAME COLUMN city_name to city;變更列的資料類型
文法
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type注意事項
不支援變更主鍵列的資料類型。
變更資料類型的限制如下:
僅支援將取值範圍小的資料類型更改為取值範圍大的資料類型。
整數資料型別:支援TINYINT、SMALLINT、INT、BIGINT間,小類型到大類型的更改,例如支援將TINYINT更改為BIGINT,不支援將BIGINT更改為TINYINT。
浮點數據類型:支援將FLOAT更改為DOUBLE類型,不支援將DOUBLE更改為FLOAT類型。
支援將整數資料型別(TINYINT、SMALLINT、INT、BIGINT)變更為浮點類型(FLOAT、DOUBLE)。
支援變更DECIMAL類型精度,僅支援低精度向高精度變更。
重要僅核心版本為3.1.8.10~3.1.8.x、3.1.9.6~3.1.9.x、3.1.10.3~3.1.10.x和3.2.0.1及以上版本的叢集支援將整數資料型別變更為浮點類型和變更DECIMAL類型精度。
樣本
將customer表中age列由INT類型更改為BIGINT類型。
ALTER TABLE adb_demo.customer MODIFY COLUMN age BIGINT;變更列的預設值
文法
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT {constant | CURRENT_TIMESTAMP}樣本
將
customer表中的sex列的預設值設定為0。
ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;將
customer表中的login_time列的預設值設定為CURRENT_TIMESTAMP。
ALTER TABLE adb_demo.customer MODIFY COLUMN login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;允許空值(NULL)
文法
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type {NULL}注意事項
僅支援將NOT NULL變更為NULL。
樣本
將customer表中province列的值更改為可空(NULL)。
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR NULL;變更列的COMMENT
文法
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type COMMENT 'new_comment'樣本
將customer表中province列的COMMENT更改為顧客所屬省份。
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT '顧客所屬省份';索引
增加索引
AnalyticDB for MySQL建立XUANWU_V2表時預設不建立全列索引INDEX_ALL='N',建立XUANWU表時預設建立全列索引INDEX_ALL='Y'。若在建立XUANWU_V2表或XUANWU表時未建立全列索引,可以新增索引。
文法
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)參數說明
column_name:列名。資料類型為單一資料型別。如果列的資料類型為JSON,請參見增加JSON索引。
樣本
在customer表中為age列新增索引。
ALTER TABLE adb_demo.customer ADD KEY age_idx(age);修改全列索引
AnalyticDB for MySQL的XUANWU_V2表支援在建表完成後,修改全列索引。該功能通過表屬性INDEX_ALL實現。JSON索引、全文索引、向量索引等非普通索引不受影響。
前提條件
叢集核心大版本為3.2.3且為3.2.3.7及以上,3.2.4且為3.2.4.3及以上的XUANWU_V2表。
請在雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本。
文法
ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};參數說明
Y:全列索引模式。為所有列建立普通索引。原表屬性
INDEX_ALL='N',修改表屬性為INDEX_ALL='Y'後,將補全該表缺失的普通索引。N:非全列索引模式。只為主鍵建立普通索引,其他列不建立普通索引。原表屬性
INDEX_ALL='Y',修改表屬性為INDEX_ALL='N'後,將刪除主鍵列外的所有普通索引。
注意事項
XUANWU表全列索引功能僅支援在建表時進行配置,取消全列索引需執行刪除索引語句手動刪除索引。
全列索引
INDEX_ALL='Y'時,執行刪除普通索引的DDL操作會導致全列索引狀態由INDEX_ALL='Y'自動切換為INDEX_ALL='N'。此操作僅刪除目標普通索引,不會刪除其他普通索引。當表屬性
INDEX_ALL='N'時,執行SHOW CREATE TABLE語句時,可能不會顯式展示表屬性為INDEX_ALL='N',但實際生效的表屬性仍為INDEX_ALL='N'。
樣本
假設
customer表處於INDEX_ALL='Y'狀態。執行以下語句修改表屬性為INDEX_ALL='N'。ALTER TABLE adb_demo.customer INDEX_ALL = 'N';修改後,會刪除
customer_name、city_name、sex等所有非主鍵列的普通索引。假設
customer表處於INDEX_ALL='N'狀態,customer_id、phone_num、login_time欄位已有索引。執行以下語句會修改表屬性為INDEX_ALL='Y'。ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';修改後,會為
customer_name、city_name、sex等原本無普通索引的列建立普通索引。
增加JSON索引
注意事項
JSON索引
文法
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')參數說明
column_name:用於為JSON列建立索引。列的資料類型需要為JSON類型。
column_name->'$.json_path':用於為JSON的某個屬性鍵建立索引。其中column_name指定的列需要為JSON類型。關於JSON索引的更多詳情,請參見JSON索引。
重要僅3.1.6.8及以上核心版本的叢集支援
column_name->'$.json_path。請在雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本。
為JSON列中的指定屬性鍵建立索引時,若該JSON列已存在INDEX索引,需先刪除該列的INDEX索引,否則會報錯。
樣本
假設表結構與寫入語句如下。
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);INSERT INTO json_test VALUES(1,'{"a":1,"b":2}'),(2,'{"a":2,"b":3}'));為json_test表的vj列的屬性a建立JSON索引。
ALTER TABLE json_test ADD KEY age_idx(vj->'$.a');JSON Array索引
文法
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')參數說明
column_name->'$[*]':column_name為JSON Array索引的列。例如:vj->'$[*]'表示為vj列建立JSON Array索引。
樣本
假設表結構與寫入語句如下。
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');為json_test表的vj列建立JSON Arrary索引。
ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');刪除索引、JSON索引
文法
ALTER TABLE db_name.table_name DROP KEY index_name參數說明
index_name:普通索引名稱。您通過SHOW INDEX FROM db_name.table_name;查詢index_name。
樣本
刪除
customer表中名為age_idx的索引。ALTER TABLE adb_demo.customer DROP KEY age_idx;刪除
json_test表中名為index_vj的JSON Array索引。ALTER TABLE adb_demo.customer DROP KEY index_vj;
增加叢集索引
文法
ALTER TABLE db_name.table_name ADD CLUSTERED [INDEX|KEY] [index_name] (column_name1 [ASC|DESC], column_name2 [ASC|DESC])注意事項
叢集索引預設為升序排列(ASC),適用於升序查詢。如果您的查詢是降序的,請在建立表時將叢集索引設定為降序(DESC)。
如果表已存在叢集索引,則無法再添加叢集索引。原因為一個表只能有一個叢集索引。
增加叢集索引後,需要該表再次觸發並完成BUILD任務後,叢集索引才會生效。通過
SHOW CREATE TABLE db_name.table_name;可以查詢叢集索引是否已生效。
樣本
在customer表中為customer_id列新增叢集索引。
ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);刪除叢集索引
文法
ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name參數說明
index_name:叢集索引名稱。通過SHOW CREATE TABLE db_name.table_name可以查詢叢集索引名稱。
樣本
刪除customer表的名稱為index的叢集索引。
ALTER TABLE adb_demo.customer DROP CLUSTERED KEY index;增加全文索引
前提條件
叢集核心版本需為3.1.4.9及以上版本。
推薦使用核心版本為3.1.4.17及以上的AnalyticDB for MySQL叢集。
如何查看叢集的核心版本,請參見如何查看執行個體版本資訊。
文法
ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]參數說明
column_name:全文索引的列。必須是VARCHAR類型的列。
index_option:指定全文索引的分詞器和自訂字典。可選。
注意事項
增加全文索引後,需要該表再次觸發並完成BUILD任務後,全文索引才會生效。
樣本
為customer表的home_address列添加全文索引。
ALTER TABLE adb_demo.customer ADD FULLTEXT INDEX fidx_k(home_address) WITH ANALYZER standard;刪除全文索引
文法
ALTER TABLE db_name.table_name DROP FULLTEXT INDEX index_name參數說明
column_name:全文索引的列。必須是VARCHAR類型的列。
index_option:指定全文索引的分詞器和自訂字典。可選。
樣本
為customer表刪除全文索引fidx_k。
ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;更多詳情請參見建立全文索引。
增加向量索引
前提條件
叢集的核心版本需為3.1.4.0及以上版本。
核心版本為3.1.5.16、3.1.6.8、3.1.8.6及以上版本的叢集向量索引功能相對穩定。
若您的叢集不是上述列舉的穩定版本,建議您先將參數CSTORE_PROJECT_PUSH_DOWN和CSTORE_PPD_TOP_N_ENABLE設定為false,再使用向量索引功能。
如何查看叢集核心版本,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。
文法
ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]參數說明
index_name:索引名。索引的命名規則,請參見命名約束。
column_name:向量列的名稱。向量列的類型需要為
array <float>、array <byte>、array <smallint>。algorithm:向量距離計算公式使用的演算法,取值僅支援:
HNSW_PQ。distancemeasure:向量距離計算公式,取值僅支援:
SquaredL2。SquaredL2的計算公式為:(x1-y1)2+(x2-y2)2+…...(xn-yn)2。
樣本
假設已有表vector,建表語句如下。
CREATE TABLE vector (
xid BIGINT not null,
cid BIGINT not null,
uid VARCHAR not null,
vid VARCHAR not null,
wid VARCHAR not null,
float_feature array < FLOAT >(4),
short_feature array < SMALLINT >(4),
PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);為float_feature和short_feature建立向量索引,樣本如下。
ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);增加外鍵
前提條件
AnalyticDB for MySQL叢集核心版本需為3.1.10或以上。
請在雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本。
文法
ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)參數說明
db_name.table_name:需要添加或刪除外鍵的表。
symbol:可選項,外鍵約束名,在表內唯一。不指定時,解析器將會在外鍵列名後面自動補充尾碼_fk用作外鍵約束名。
fk_column_name:指定外鍵列。外鍵列需要在建表語句中定義。
pk_table_name:指定主表名。主表必須已存在。
pk_column_name:指定外鍵約束列,該列必須存在且為主表的主鍵列。
注意事項
每個表可以有多個外鍵索引。
不支援複合的外鍵索引,即不支援多個列組成的外鍵索引,例如:
FOREIGN KEY (sr_item_sk, sr_ticket_number) REFERENCES store_sales(ss_item_sk,d_date_sk)。AnalyticDB for MySQL不會進行資料的約束檢查。您需要自行確保主表的主鍵和從表的外鍵之間的資料約束關係。
外表不支援建立外鍵約束。
樣本
假設有兩張表item和store_sales,建表語句如下。
CREATE TABLE item
(
i_item_sk BIGINT NOT NULL,
i_current_price BIGINT,
PRIMARY KEY(i_item_sk)
)
DISTRIBUTED BY HASH(i_item_sk);CREATE TABLE store_sales
(
ss_sale_id BIGINT,
ss_store_sk BIGINT,
ss_item_sk BIGINT NOT NULL,
PRIMARY KEY(ss_sale_id)
);為表store_sales添加外鍵ss_item_sk,與主表item的i_item_sk相關聯,樣本如下。
ALTER TABLE store_sales ADD CONSTRAINT ss_item_sk FOREIGN KEY (ss_item_sk) REFERENCES item (i_item_sk);更多詳情請參見通過主外鍵約束消除多餘的JOIN。
刪除外鍵
文法
ALTER TABLE db_name.table_name DROP FOREIGN KEY fk_symbol樣本
ALTER TABLE store_returns DROP FOREIGN KEY sr_item_sk_fk;分區
變更分區的生命週期
文法
ALTER TABLE db_name.table_name PARTITIONS N注意事項
3.2.4.1及以上核心版本,支援通過將LIFECYCLE參數
N設為0來取消分區的生命週期管理。變更分區的生命週期後,需要該表再次觸發並完成BUILD任務後,新的生命週期才會生效。通過
SHOW CREATE TABLE db_name.table_name;查詢新的生命週期是否已生效。
樣本1
取消customer表的生命週期。
ALTER TABLE customer PARTITIONS 0;樣本2
將customer表的生命週期由30改為40。
ALTER TABLE customer PARTITIONS 40;刪除分區
ALTER TABLE DROP PARTITION作用等同於TRUNCATE TABLEPARTITION。
文法
ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)注意事項
刪除分區後,該分區內的資料也會被刪除且無法找回,請謹慎操作。
樣本
刪除
customer表中的20241220分區。ALTER TABLE adb_demo.customer DROP PARTITION (20241220);刪除
customer表中的20241218和20241219分區。ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);
儲存策略
變更冷熱階層式存放區策略
前提條件
叢集的產品系列:企業版、基礎版、湖倉版或數倉版彈性模式。
核心版本:
表引擎為XUANWU,叢集的核心版本無限制。
表引擎為XUANWU_V2,叢集的核心版本需滿足以下任一條件:
3.2.2且為3.2.2.15及以上版本。
3.2.3且為3.2.3.13及以上版本。
3.2.4且為3.2.4.9及以上版本。
3.2.5且為3.2.5.3及以上版本。
說明請在雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本。
表引擎為XUANWU_V2時,叢集已開啟定期調度冷熱變更的任務配置:
查詢是否開啟:
SHOW ADB_CONFIG KEY=SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE;。如果返回FALSE代表未開啟此配置,需設定開啟;返回報錯代表未設定(預設為TRUE)。設定開啟:
SET ADB_CONFIG SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE = true;。
文法
ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}注意事項
變更冷熱階層式存放區策略後,需等待該表再次觸發並完成BUILD任務後(預設後台定期自動執行)方可生效。在BUILD完成前,通過information_schema.table_usage查詢的熱分區數量與定義的儲存策略不一致,屬於正常現象。通過SHOW CREATE TABLE db_name.table_name;可以查詢新的儲存策略是否生效。
樣本
更改
customer表的儲存策略為COLD。ALTER TABLE customer storage_policy = 'COLD';更改
customer表的儲存策略為HOT。ALTER TABLE customer storage_policy = 'HOT';更改
customer表的儲存策略為MIXED,其中熱分區的個數為10個。ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;