全部产品
Search
文档中心

云原生大数据计算服务 MaxCompute:列操作

更新时间:Dec 24, 2025

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 struct<province:string, area:string>);
    • 示例4:增加Delta Table的列。

      ALTER TABLE mf_tt ADD COLUMNS (val2 bigint);
    • 示例5:给表sale_detail增加ID列SQL会返回成功,但实际并不会重复增加。

      -- 返回成功,但实际并不会重复增加ID列。
      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id 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:必填。待删除的列名称。

  • 使用示例

    -- 删除表sale_detail单个列customer_id。输入yes确认后,即可删除列。 
    ALTER TABLE sale_detail DROP COLUMN customer_id;
    
    -- 删除表sale_detail的列customer_id。输入yes确认后,即可删除列。
    ALTER TABLE sale_detail DROP COLUMNS customer_id;
    
    -- 删除表sale_detail的列shop_name和customer_id。输入yes确认后,即可删除列。
    ALTER TABLE sale_detail DROP COLUMNS shop_name, customer_id;

更改列数据类型

为已存在的列更改数据类型,请注意表结构变更使用限制

  • 参数设置

    设置参数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

    待修改的列修改后的数据类型。

  • 使用示例

    -- 将mf_evol_t3表的id字段由INT转化为BIGINT。
    ALTER TABLE mf_evol_t3 CHANGE id id BIGINT;
    
    -- 将mf_evol_t3表的id字段类型由BIGINT转化为STRING。
    ALTER TABLE mf_evol_t3 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_id为customer并位于total_price之后。
    ALTER TABLE sale_detail CHANGE customer_id customer 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_detail 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_name为customer_newname,注释“客户”为“customer”。
    ALTER TABLE sale_detail CHANGE COLUMN customer_name 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);
    
    -- 修改id列允许为NULL。
    ALTER TABLE null_test CHANGE COLUMN id NULL;

相关文档

更多关于表操作命令详情,请参见: