ALTER TABLE

ALTER TABLE
ALTER TABLE
用于修改表的结构和属性,包括重命名表/列、添加/删除/修改列、设置注释和属性等。

重命名表

ALTER TABLE <table_name> RENAME TO <new_name>;

新名称只填表名,不含 schema 前缀,表仍保留在原 schema 下。

示例

ALTER TABLE doc_test.logs RENAME TO system_logs; DESC TABLE doc_test.system_logs;

column_name | data_type | comment -------------|---------------|-------- log_id | bigint | level | string | message | string | created_at | timestamp_ltz |

添加列

-- 添加单列 ALTER TABLE <table_name> ADD COLUMN [IF NOT EXISTS] <column_name> <data_type> [DEFAULT '<value>'] [COMMENT '<comment>'] [FIRST | AFTER <existing_column>]; -- 一次添加多列 ALTER TABLE <table_name> ADD COLUMNS (<col1> <type1>, <col2> <type2>, ...);

  • IF NOT EXISTS
    IF NOT EXISTS
    :列已存在时静默跳过,不报错,适合幂等操作
  • DEFAULT
    DEFAULT
    :新列的默认值,仅对新插入的行生效,已有行的该列值为 NULL
  • FIRST
    FIRST
    /
    AFTER <col>
    AFTER <col>
    :控制新列在表中的位置;不指定时追加到末尾
  • ADD COLUMNS
    ADD COLUMNS
    (复数):一次添加多列,不支持 IF NOT EXISTS 和位置控制

示例

-- 添加单列,带注释 ALTER TABLE doc_test.employees ADD COLUMN phone STRING COMMENT '联系电话'; -- 幂等添加(已存在不报错) ALTER TABLE doc_test.employees ADD COLUMN IF NOT EXISTS phone STRING; -- 添加到指定位置 ALTER TABLE doc_test.employees ADD COLUMN emp_code STRING AFTER id; -- 一次添加多列 ALTER TABLE doc_test.employees ADD COLUMNS (region STRING, level INT); -- 添加带默认值的列(注意:已有行为 NULL,不回填) ALTER TABLE doc_test.employees ADD COLUMN status STRING DEFAULT 'active'; SELECT id, name, status FROM doc_test.employees LIMIT 2;

+----+-------+--------+ | id | name | status | +----+-------+--------+ | 1 | Alice | NULL | | 2 | Bob | NULL | +----+-------+--------+

删除列

-- 删除单列 ALTER TABLE <table_name> DROP COLUMN [IF EXISTS] <column_name>; -- 一次删除多列 ALTER TABLE <table_name> DROP COLUMNS (<col1>, <col2>, ...);

  • IF EXISTS
    IF EXISTS
    :列不存在时静默跳过,不报错
  • DROP COLUMNS
    DROP COLUMNS
    (复数):一次删除多列

示例

-- 删除单列 ALTER TABLE doc_test.employees DROP COLUMN phone; -- 幂等删除(不存在不报错) ALTER TABLE doc_test.employees DROP COLUMN IF EXISTS phone; -- 一次删除多列 ALTER TABLE doc_test.employees DROP COLUMNS (region, level);

重命名列

ALTER TABLE <table_name> RENAME COLUMN <old_name> TO <new_name>;

示例

ALTER TABLE doc_test.employees RENAME COLUMN dept TO department; DESC TABLE doc_test.employees;

修改列类型

ALTER TABLE <table_name> ALTER COLUMN <column_name> TYPE <new_data_type>;

类型修改必须兼容,不兼容的转换会报错。常见的兼容转换:

原类型可转换为说明
DECIMAL(10,2)
DECIMAL(10,2)
DECIMAL(15,2)
DECIMAL(15,2)
扩展精度,可以
INT
INT
BIGINT
BIGINT
扩展范围,可以
DECIMAL(15,2)
DECIMAL(15,2)
DECIMAL(10,2)
DECIMAL(10,2)
缩减精度,报错
DECIMAL
DECIMAL
STRING
STRING
不兼容,报错
STRING
STRING
VARCHAR(100)
VARCHAR(100)
不兼容,报错

示例

-- 扩展 DECIMAL 精度 ALTER TABLE doc_test.employees ALTER COLUMN salary TYPE DECIMAL(15,2); -- INT 扩展为 BIGINT ALTER TABLE doc_test.employees ALTER COLUMN id TYPE BIGINT; -- 不兼容类型(报错示例) ALTER TABLE doc_test.employees ALTER COLUMN salary TYPE STRING; -- 错误:Cannot change data type from decimal(15,2) to string, types are incompatible or conversion may cause data loss

修改列注释

ALTER TABLE <table_name> ALTER COLUMN <column_name> COMMENT '<comment_text>';

示例

ALTER TABLE doc_test.employees ALTER COLUMN name COMMENT '员工姓名'; ALTER TABLE doc_test.employees ALTER COLUMN id COMMENT '员工ID'; DESC TABLE doc_test.employees;

column_name | data_type | comment -------------|-----------|-------- id | bigint | 员工ID name | string | 员工姓名 ...

添加生成列

生成列的值由表达式自动计算,无需手动写入。

ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> GENERATED ALWAYS AS (<expression>);

示例

ALTER TABLE doc_test.employees ADD COLUMN name_upper STRING GENERATED ALWAYS AS (UPPER(name)); SELECT id, name, name_upper FROM doc_test.employees LIMIT 2;

+----+-------+------------+ | id | name | name_upper | +----+-------+------------+ | 1 | Alice | ALICE | | 2 | Bob | BOB | +----+-------+------------+

详细用法参见生成列使用指南

分区操作

PARTITIONED BY
PARTITIONED BY
建立的分区表,支持删除分区:

ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION (<col>='<val>', ...);

  • 分区只能通过向表中写入数据自动创建,不支持
    ADD PARTITION
    ADD PARTITION
    手动创建
  • IF EXISTS
    IF EXISTS
    :分区不存在时静默跳过,不报错

示例

CREATE TABLE IF NOT EXISTS events ( id INT, name STRING ) PARTITIONED BY (dt STRING); INSERT INTO events VALUES (1, 'login', '2024-01'), (2, 'logout', '2024-02'); SHOW PARTITIONS events;

+----------+ | dt | +----------+ | 2024-01 | | 2024-02 | +----------+

-- 删除指定分区(分区数据一并删除) ALTER TABLE events DROP PARTITION (dt='2024-01'); -- 幂等删除(不存在不报错) ALTER TABLE events DROP IF EXISTS PARTITION (dt='2024-01'); SHOW PARTITIONS events;

+----------+ | dt | +----------+ | 2024-02 | +----------+

修改表注释

ALTER TABLE <table_name> SET COMMENT '<comment_text>';

清除注释:

SET COMMENT ''
SET COMMENT ''
(设为空字符串)。

示例

ALTER TABLE doc_test.products SET COMMENT '产品信息表'; SHOW CREATE TABLE doc_test.products;

CREATE TABLE quick_start.doc_test.products( `product_id` int, `name` string, `price` decimal(10,2), `stock` int, `category` string) USING PARQUET COMMENT '产品信息表';

-- 清除注释:SET COMMENT 设为空字符串 ALTER TABLE doc_test.products SET COMMENT '';

修改表属性

-- 设置属性 ALTER TABLE <table_name> SET PROPERTIES ('<key>'='<value>'); -- 删除属性 ALTER TABLE <table_name> UNSET PROPERTIES ('<key>');

SET TBLPROPERTIES
SET TBLPROPERTIES
SET PROPERTIES
SET PROPERTIES
等价,两者均支持。

支持的内置属性

属性名描述取值范围
data_lifecycle
data_lifecycle
数据生命周期(TTL),超期未更新自动回收数据大于 0 的正整数,-1 表示未开启
data_retention_days
data_retention_days
Time Travel 保留周期,决定可访问的历史数据时长0-90 天

示例

-- 设置数据生命周期为 30 天 ALTER TABLE doc_test.logs SET PROPERTIES ('data_lifecycle'='30'); -- 设置 Time Travel 保留周期为 7 天 ALTER TABLE doc_test.logs SET PROPERTIES ('data_retention_days'='7'); -- 删除属性 ALTER TABLE doc_test.logs UNSET PROPERTIES ('data_lifecycle'); -- 查看属性 SHOW PROPERTIES IN TABLE doc_test.logs;

info_name | info_value ---------------------|---------- data_retention_days | 7

注意事项

  • 动态表不支持 ALTER 修改 SQL 定义:动态表(Dynamic Table)不支持通过

    ALTER TABLE
    ALTER TABLE
    修改查询定义。如需修改动态表的 SQL 逻辑、刷新间隔或计算集群,请使用
    CREATE OR REPLACE DYNAMIC TABLE
    CREATE OR REPLACE DYNAMIC TABLE

  • 列操作限制:添加列时,新列对已有数据默认为 NULL(DEFAULT 值不回填历史行)。删除列后数据不可恢复。

  • 类型转换限制

    STRING
    STRING
    VARCHAR
    VARCHAR
    之间不可互转;类型缩减(如
    DECIMAL(15,2)
    DECIMAL(15,2)
    DECIMAL(10,2)
    DECIMAL(10,2)
    )会报错。

  • DESC TABLE 查看结构:使用

    DESC TABLE <table_name>
    DESC TABLE <table_name>
    查看表的完整结构,包括列名、数据类型和注释。

相关文档

联系我们
预约咨询
微信咨询
电话咨询