全部產品
Search
文件中心

MaxCompute:列操作

更新時間:Jan 15, 2026

MaxCompute支援對已有表的列執行變更操作,如添加列、刪除列、更改列資料類型等,可以根據實際業務情境執行相應操作。

操作命令

MaxCompute SQL的列操作命令如下:

操作

功能

角色

操作入口

添加列或注釋

為已存在的非分區表或分區表添加列或注釋。

具備修改表許可權(Alter)的使用者

可以在如下工具平台執行本文命令:

刪除列

刪除已存在的非分區表或分區表的列。

更改列資料類型

更改已存在列的資料類型。

修改列的順序

調整表中指定列的順序。

修改列名

為已存在的非分區表或分區表修改列名稱。

修改列注釋

為已存在的非分區表或分區表修改列注釋。

修改列名及注釋

為已存在的非分區表或分區表同時修改列名稱和列注釋。

修改表的列非空屬性

修改非分區列的非空屬性。

適用範圍

表結構變更(Schema Evolution)包括對現有表新增複雜資料類型列、刪除列、修改列順序和修改列的資料類型。在下列情境中,如果執行了更改表的列順序、添加新列並修改列順序或刪除列這三種操作,會使表的讀寫行為發生變化,且存在以下限制:

  • 作業類型是MapReduce 1.0時,Graph任務無法讀寫修改表。

  • CUPID作業只有Spark以下版本可以讀表,但是不可以寫表:

    • Spark-2.3.0-odps0.34.0

    • Spark-3.1.1-odps0.34.0

  • PAI作業可以讀表,但不可以寫表。

  • Hologres作業在1.3版本之前,Hologres引用修改的表作為外部表格時,無法讀寫該表。

  • 如果發生表結構變更,則不支援CLONE TABLE

  • 如果發生表結構變更,則使用Streaming Tunnel會報錯。

添加列或注釋

為已存在的非分區表或分區表添加列或注釋,請注意表結構變更適用範圍。MaxCompute已支援添加STRUCT類型的列,例如STRUCT<x: STRING, y: BIGINT>MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>>

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    ALTER TABLE <table_name> 
      ADD COLUMNS [IF NOT EXISTS]
      (<col_name1> <type1> COMMENT ['<col_comment>']
      [, <col_name2> <type2> COMMENT '<col_comment>'...]
      );
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待新增列的表名稱。添加的新列不支援指定順序,預設在最後一列。

    col_name

    新增列的名稱。

    type

    新增列的資料類型。

    col_comment

    新增列的注釋。

  • 使用樣本

    • 樣本1:給表sale_detail添加兩個列。

      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT);
    • 樣本2:給表sale_detail添加兩個列並同時添加列注釋。

      ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT '客戶', education BIGINT COMMENT '教育' );
    • 樣本3:給表sale_detail添加一個複雜資料類型列。

      ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>);
    • 樣本4:給表sale_detail增加ID列SQL會返回成功,但實際並不會重複增加。

      -- 返回成功,但實際並不會重複增加ID列。
      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint);
    • 樣本5:增加Delta Table的列。

      CREATE TABLE delta_table_test (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
        TBLPROPERTIES ("transactional"="true");
        
      ALTER TABLE delta_table_test ADD COLUMNS (val2 bigint);

刪除列

為已存在的非分區表或分區表刪除指定的單個或多個列,請注意表結構變更適用範圍

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    -- 刪除單個列。
    ALTER TABLE <table_name> DROP COLUMN <col_name>;
    
    -- 刪除多列。
    ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...];
  • 參數說明

    • table_name:必填。待刪除列的表名稱。

    • col_name:必填。待刪除的列名稱。

  • 使用樣本

    -- 樣本1:刪除表sale_detail的單個列customer_id
    ALTER TABLE sale_detail DROP COLUMNS customer_id;
    
    -- 樣本2:刪除表sale_detail的多個列shop_name和total_price
    ALTER TABLE sale_detail DROP COLUMNS shop_name, total_price;

更改列資料類型

為已存在的列更改資料類型,請注意表結構變更適用範圍

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    ALTER TABLE <table_name> CHANGE [COLUMN] <old_column_name> <new_column_name> <new_data_type>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列資料類型的表名稱。

    old_column_name

    待修改列資料類型的列名稱。

    new_column_name

    修改列資料類型後的列名稱。

    old_column_name可以與new_column_name保持一致,表示不修改列名稱。但是new_column_name不能與除old_column_name之外的列名稱相同。

    new_data_type

    待修改的列修改後的資料類型。

  • 使用樣本

    -- 將sale_detail表的id欄位類型由BIGINT轉化為STRING。
    ALTER TABLE sale_detail CHANGE COLUMN id id STRING;
  • 資料類型支援轉換表

    說明

    Y表示支援轉換;N表示不支援轉換;-表示不涉及;Y()表示滿足括弧內的條件支援轉換。

    資料類型支援轉換表

修改列的順序

為已存在的非分區表或分區表修改列順序,請注意表結構變更適用範圍

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列順序的表名稱。

    old_column_name

    待修改順序的列的原始名稱。

    new_col_name

    修改後的列名稱。

    new_col_name可以與old_column_name保持一致,表示不修改列名稱。但new_col_name不能與除old_column_name的之外的列名稱相同。

    column_type

    待修改的列的未經處理資料類型。不可修改。

    column_name

    將待調整順序的列調整至column_name之後。

  • 使用樣本

    -- 將表sale_detail的列customer修改為customer_id並位於total_price之後。
    ALTER TABLE sale_detail CHANGE customer customer_id STRING AFTER total_price;
    
    -- 修改表sale_detail的列customer_id位於total_price之後,不修改列名稱。
    ALTER TABLE sale_detail CHANGE customer_id customer_id STRING AFTER total_price;

修改列名

為已存在的非分區表或分區表修改列名稱。

  • 命令格式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> RENAME TO <new_col_name>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列名的表名稱。

    old_col_name

    待修改的列名稱。必須是已存在的列。

    new_col_name

    修改後的列名稱,列名稱不能重複。

  • 使用樣本

    -- 修改表sale_detail的列名customer_name為customer。
    ALTER TABLE sale_detail CHANGE COLUMN customer_name RENAME TO customer;

修改列注釋

為已存在的非分區表或分區表修改列注釋。

  • 文法格式

    ALTER TABLE <table_name> CHANGE COLUMN <col_name> COMMENT '<col_comment>';
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列注釋的表名稱。

    col_name

    待修改注釋的列名稱。必須是已存在的列。

    col_comment

    修改後的注釋資訊。注釋內容為長度不超過1024位元組的有效字串,否則報錯。

  • 使用樣本

    -- 修改表sale_detail的列customer的注釋。
    ALTER TABLE sale_detail0113 CHANGE COLUMN customer COMMENT 'customer';

修改列名及注釋

修改非分區表或分區表的列名或注釋。

  • 命令格式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> <new_col_name> <column_type> COMMENT '<col_comment>';
  • 參數說明

    參數

    是否必填

    說明

    table_name

    需要修改列名以及注釋的表名稱。

    old_col_name

    需要修改的列名稱。必須是已存在的列。

    new_col_name

    新的列名稱,列名稱不能重複。

    column_type

    列的資料類型。

    col_comment

    可選

    修改後的注釋資訊,內容最長為1024位元組。

  • 使用樣本

    -- 修改表sale_detail的列名customer為customer_newname,注釋“客戶”為“customer”。
    ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';

修改表的列非空屬性

修改表的非分區列的非空屬性。即如果表的非分區列值禁止為NULL,可以通過本命令修改分區列值允許為NULL

修改分區列值允許為NULL後,不可回退,不支援再修改分區列值禁止為NULL,請謹慎操作。

  • 通過DESC EXTENDED table_name;命令查看Nullable屬性值,判斷列的非空屬性:

    • 如果Nullabletrue,表示允許為NULL;

    • 如果Nullablefalse,表示禁止為NULL。

  • 命令格式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列非空屬性的表名稱。

    old_col_name

    待修改的非分區列的名稱。必須是已存在的非分區列。

  • 使用樣本

    -- 建立一張分區表,id列禁止為NULL。
    CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string);
    
    -- 查看錶屬性
    DESC EXTENDED null_test;
    -- 返回結果如下:
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | int    |       |               | false    | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | string     |                                                     |
    +------------------------------------------------------------------------------------+
    
    -- 修改id列允許為NULL。
    ALTER TABLE null_test CHANGE COLUMN id NULL;
    -- 查看錶屬性
    DESC EXTENDED null_test;
    -- 返回結果如下:
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | int    |       |               | true     | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | string     |                                                     |
    +------------------------------------------------------------------------------------+

相關文檔

更多關於表操作命令詳情,請參見: