全部產品
Search
文件中心

AnalyticDB:ALTER TABLE變更表結構

更新時間:Nov 12, 2025

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表。

樣本的建表語句

CREATE TABLE customer (
  customer_id BIGINT NOT NULL COMMENT '顧客ID',
  customer_name VARCHAR NOT NULL COMMENT '顧客姓名',
  phone_num BIGINT NOT NULL COMMENT '電話',
  city_name VARCHAR NOT NULL COMMENT '所屬城市',
  sex INT NOT NULL COMMENT '性別',
  id_number VARCHAR NOT NULL COMMENT '社會安全號碼碼',
  home_address VARCHAR NOT NULL COMMENT '家庭住址',
  office_address VARCHAR NOT NULL COMMENT '辦公地址',
  age INT NOT NULL COMMENT '年齡',
  login_time TIMESTAMP NOT NULL COMMENT '登入時間',
  PRIMARY KEY (login_time,customer_id,phone_num)
 )
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT '客戶資訊表';                   

變更表名

文法

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'};

參數說明

INDEX_ALL:是否為所有列建立普通索引。取值如下:

  • 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_namecity_namesex等所有非主鍵列的普通索引。

  • 假設customer表處於INDEX_ALL='N'狀態,customer_idphone_numlogin_time欄位已有索引。執行以下語句會修改表屬性為INDEX_ALL='Y'

    ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';

    修改後,會為customer_namecity_namesex等原本無普通索引的列建立普通索引。

增加JSON索引

注意事項

  • XUANWU_V2表(分區表和非分區表),建立JSON索引或JSON Array索引後,無需BUILD,索引立即生效。

  • XUANWU非分區表,建立JSON索引或JSON Array索引後,需要BUILD,待BUILD完成後索引才會生效。

  • XUANWU分區表,建立JSON索引或JSON Array索引後,必須手動強制全表BUILD,待BUILD完成後索引才會生效。

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索引

    重要

樣本

假設表結構與寫入語句如下。

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及以上版本。

說明

文法

ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]

參數說明

  • column_name:全文索引的列。必須是VARCHAR類型的列。

  • index_option:指定全文索引的分詞器和自訂字典。可選。

    • WITH ANALYZER analyzer_name:指定全文索引的分詞器。AnalyticDB for MySQL支援的分詞器類型,請參見全文索引的分詞器

    • WITH DICT tbl_dict_name:指定全文索引的自訂字典。AnalyticDB for MySQL自訂字典的詳細資料,請參見全文索引的自訂字典

注意事項

增加全文索引後,需要該表再次觸發並完成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:指定全文索引的分詞器和自訂字典。可選。

    • WITH ANALYZER analyzer_name:指定全文索引的分詞器。AnalyticDB for MySQL支援的分詞器類型,請參見全文索引的分詞器

    • WITH DICT tbl_dict_name:指定全文索引的自訂字典。AnalyticDB for MySQL自訂字典的詳細資料,請參見全文索引的自訂字典

樣本

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_DOWNCSTORE_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:向量距離計算公式,取值僅支援:SquaredL2SquaredL2計算公式為:(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_featureshort_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不會進行資料的約束檢查。您需要自行確保主表的主鍵和從表的外鍵之間的資料約束關係。

  • 外表不支援建立外鍵約束。

樣本

假設有兩張表itemstore_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,與主表itemi_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表中的2024121820241219分區。

    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;

常見問題

是否支援變更列的順序?

不支援變更列順序。

怎樣把VARCHAR類型的列變更為LONGTEXT類型?

AnalyticDB for MySQL支援的字串類型包括varcharbinary。其中,varchar對應MySQL中的charvarchartextmediumtext或者longtext。因此,您無需將VARCHAR類型的列變更為LONGTEXT類型。

已建表且表中已有資料,現新增一個自增列,歷史資料的自增列值為空白,能否自增填充?

不能。已建表且表中已有資料時,增加自增列,只有新寫入資料的自增列的值是自增的。如果需要歷史資料的自增列值自增填充,您需要建立一個包含自增列的表,並遷移資料到新表。

是否支援變更分布鍵或分區鍵?

AnalyticDB for MySQL不支援增加、刪除或變更分布鍵或分區鍵。如果您的業務需要變更分布鍵或分區鍵,可嘗試以下方案解決。

假設您有一個表order需要將現有分布鍵order_id更改為customer_id,操作如下:

  1. 使用分布鍵customer_id建立一個暫存資料表order_auto_opt_v1。

    CREATE TABLE order_auto_opt_v1 (
      order_id bigint NOT NULL COMMENT '訂單ID',
      customer_id bigint NOT NULL COMMENT '顧客ID',
      customer_name varchar NOT NULL COMMENT '顧客姓名',
      order_time timestamp NOT NULL COMMENT '訂單時間',
      --省略其他欄位
      PRIMARY KEY (order_id,customer_id,order_time) --分布鍵customer_id和分區鍵order_time需要添加到主鍵中
    )
    DISTRIBUTED BY HASH(customer_id) --修改order_id為customer_id
    PARTITION BY VALUE(DATE_FORMAT(order_time, '%Y%m%d')) LIFECYCLE 90 --二級分區保持不變
    COMMENT '訂單資訊表';
  2. 使用INSERT OVERWRITE SELECT將源表的資料匯入到暫存資料表,詳情請參見INSERT OVERWRITE SELECT

    INSERT OVERWRITE order_auto_opt_v1
    SELECT * FROM order;
  3. 判斷分布鍵是否合理。資料匯入後,需要判斷新的分布鍵是否有資料扭曲問題,詳情請參見儲存空間診斷

  4. 使用RENAME TABLE <源表表名> to <new_源表表名>;更改源表表名。

    RENAME TABLE order to order_backup; --資料匯入完成後,重新命名源表作為備份
  5. 使用RENAME TABLE <暫存資料表表名> to <源表表名>;將暫存資料表表名更改為源表表名。

    RENAME TABLE order_auto_opt_v1 to order;

是否支援增加或變更主鍵?

  • 不支援增加、刪除主鍵,即無主鍵表不能變更為有主鍵表,有主鍵表也不能變更為無主鍵表。

  • 不支援增加或減少主鍵列。

  • 不支援變更主鍵列的列名。

  • 不支援變更主鍵列的資料類型。

修改生命週期或冷熱階層式存放區策略,為什麼沒有生效?

修改生命週期或冷熱階層式存放區策略後,需要該表再次觸發並完成BUILD任務後,新的生命週期或儲存策略才會生效

當通過SHOW CREATE TABLE db_name.table_name;查詢到新設定的生命週期或儲存策略時,說明新的生命週期或儲存策略已生效。

常見報錯

syntax error, error in :'DISTRIBUTE BY HASH(`id`) PARTITION BY VAL

建立表後不支援修改表的主鍵、分區鍵和分布鍵。如果您有需求,可以重新建表並遷移資料。

Do not allow concurrent add cluster/zorder index task

完整報錯資訊樣本如下:Do not allow concurrent add cluster/zorder index task , which in progress : {"clusterColumnIds":[2],"clusterColumns":["phone_num"],"clusterIndexName":"index1","indexOptions":"ASC","type":"ADD_CLUSTERING_KEY"}。

報錯原因:一個表只能有一個叢集索引。您已通過ALTER TABLE ... ADD CLUSTERED KEY為表添加了叢集索引,但執行該語句後,該表還未觸發BUILD任務或觸發的BUILD任務還未完成,因此叢集索引尚未生效。此時,如果再次為該表添加叢集索引,將會出現上述報錯。

解決方案:添加叢集索引後,您還需要等待表再次自動觸發BUILD任務,或者您也可以手動觸發BUILD任務BUILD任務完成後,添加的叢集索引才會生效。新的叢集索引生效後,如需變更叢集索引,可刪除原來的叢集索引,再添加新的叢集索引。

通過SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;可以查看BUILD任務的狀態