ALTER TABLE

最近更新时间:2026-05-20 14:11:22

我的收藏

描述

ALTER TABLE 语句用于更改表的 schema 或属性。

重命名(RENAME)

ALTER TABLE RENAME TO 语句用于更改数据库中现有表的表名。表重命名命令不能用于在数据库之间移动表,只能在同一数据库内重命名表。
如果表已被缓存,该命令会清除表的缓存数据。缓存将在下次访问表时延迟填充。此外:
表重命名命令会取消缓存所有引用该表的依赖项(如视图)。这些依赖项需要重新显式缓存。
分区重命名命令会清除所有表依赖项的缓存,但保持它们为已缓存状态。因此,它们的缓存将在下次访问时延迟填充。

语法

ALTER TABLE table_identifier RENAME TO table_identifier

ALTER TABLE table_identifier partition_spec RENAME TO partition_spec

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
partition_spec
要重命名的分区
PARTITION ( partition_col_name = partition_col_val [ , ... ] )

添加列(ADD COLUMNS)

ALTER TABLE ADD COLUMNS 语句用于向现有表添加指定的列。

语法

ALTER TABLE table_identifier ADD COLUMNS ( col_spec [ , ... ] )

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
COLUMNS ( col_spec )
指定要添加的列
-

删除列(DROP COLUMNS)

ALTER TABLE DROP COLUMNS 语句用于从现有表中删除指定的列。注意此语句仅支持 Iceberg v2 表。

语法

ALTER TABLE table_identifier DROP { COLUMN | COLUMNS } [ ( ] col_name [ , ... ] [ ) ]

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
col_name
指定列名
-

重命名列(RENAME COLUMN)

ALTER TABLE RENAME COLUMN 语句用于更改现有表的列名。注意此语句仅支持 Iceberg v2 表。

语法

ALTER TABLE table_identifier RENAME COLUMN col_name TO col_name

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
col_name
指定列名
-

修改列(ALTER OR CHANGE COLUMN)

ALTER TABLE ALTER COLUMNALTER TABLE CHANGE COLUMN 语句用于更改列的定义。

语法

ALTER TABLE table_identifier { ALTER | CHANGE } [ COLUMN ] col_name alterColumnAction

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
col_name
指定列名
-
alterColumnAction
更改列的定义
-

替换列(REPLACE COLUMNS)

ALTER TABLE REPLACE COLUMNS 语句用于删除所有现有列并添加新的列集。注意此语句仅支持 Iceberg v2 表。

语法

ALTER TABLE table_identifier [ partition_spec ] REPLACE COLUMNS
[ ( ] qualified_col_type_with_position_list [ ) ]

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
partition_spec
要替换的分区
PARTITION ( partition_col_name = partition_col_val [ , ... ] )
qualified_col_type_with_position_list
要添加的列的列表
col_name col_type [ col_comment ] [ col_position ] [ , ... ]

添加分区(ADD PARTITION)

ALTER TABLE ADD 语句用于向分区表添加分区。如果表已被缓存,该命令会清除表及其所有引用依赖项的缓存数据。缓存将在下次访问时延迟填充。

语法

ALTER TABLE table_identifier ADD [IF NOT EXISTS]
( partition_spec [ partition_spec ... ] )

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
partition_spec
要添加的分区
PARTITION ( partition_col_name = partition_col_val [ , ... ] )

删除分区(DROP PARTITION)

ALTER TABLE DROP 语句用于删除表的分区。如果表已被缓存,该命令会清除表及其所有引用依赖项的缓存数据。缓存将在下次访问时延迟填充。

语法

ALTER TABLE table_identifier DROP [ IF EXISTS ] partition_spec [PURGE]

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
partition_spec
要删除的分区
PARTITION ( partition_col_name = partition_col_val [ , ... ] )

设置表属性(SET TABLE PROPERTIES)

ALTER TABLE SET 命令用于设置表属性。如果某个属性已经设置,新值将覆盖旧值。ALTER TABLE UNSET 用于删除表属性。

语法

-- 设置表属性
ALTER TABLE table_identifier SET TBLPROPERTIES ( key1 = val1, key2 = val2, ... )

-- 取消设置表属性
ALTER TABLE table_identifier UNSET TBLPROPERTIES [ IF EXISTS ] ( key1, key2, ... )

设置 SERDE

ALTER TABLE SET 命令用于在 Hive 表中设置 SERDE 或 SERDE 属性。如果某个属性已经设置,新值将覆盖旧值。

语法

-- 设置 SERDE 属性
ALTER TABLE table_identifier [ partition_spec ]
SET SERDEPROPERTIES ( key1 = val1, key2 = val2, ... )

ALTER TABLE table_identifier [ partition_spec ] SET SERDE serde_class_name
[ WITH SERDEPROPERTIES ( key1 = val1, key2 = val2, ... ) ]

设置位置和文件格式(SET LOCATION And SET FILE FORMAT)

ALTER TABLE SET 命令也可用于更改现有表的文件位置和文件格式。如果表已被缓存,ALTER TABLE .. SET LOCATION 命令会清除表及其所有引用依赖项的缓存数据。

语法

-- 更改文件格式
ALTER TABLE table_identifier [ partition_spec ] SET FILEFORMAT file_format

-- 更改文件位置
ALTER TABLE table_identifier [ partition_spec ] SET LOCATION 'new_location'

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name
partition_spec
指定要设置属性的分区
PARTITION ( partition_col_name = partition_col_val [ , ... ] )
SERDEPROPERTIES
指定要设置的 SERDE 属性
( key1 = val1, key2 = val2, ... )

恢复分区(RECOVER PARTITIONS)

ALTER TABLE RECOVER PARTITIONS 语句用于恢复表目录中的所有分区并更新 Hive 元数据存储。另一种恢复分区的方法是使用 MSCK REPAIR TABLE

语法

ALTER TABLE table_identifier RECOVER PARTITIONS

参数

参数
说明
语法
table_identifier
指定表名,可以选择性地用数据库名进行限定
[ database_name. ] table_name

示例

-- 创建分区表
CREATE EXTERNAL TABLE student_alter_test (name STRING, rollno INT)
USING PARQUET
PARTITIONED BY (age INT)
LOCATION 'cosn://<your_bucket_name>//test_alter_table/student';

-- 重命名表
ALTER TABLE student_alter_test RENAME TO student_info_test;

-- 验证重命名后的表结构
DESC student_info_test;

-- 添加列
ALTER TABLE student_info_test ADD COLUMNS (LastName STRING, DOB TIMESTAMP);

-- 修改列注释
ALTER TABLE student_info_test ALTER COLUMN LastName COMMENT 'new comment';

-- 添加分区
ALTER TABLE student_info_test ADD IF NOT EXISTS PARTITION (age=18);
ALTER TABLE student_info_test ADD IF NOT EXISTS PARTITION (age=18) PARTITION (age=20);

-- 查看分区
SHOW PARTITIONS student_info_test;

-- 删除分区
ALTER TABLE student_info_test DROP IF EXISTS PARTITION (age=20);

-- 设置表属性
ALTER TABLE student_info_test SET TBLPROPERTIES ('winner' = 'loser');
ALTER TABLE student_info_test UNSET TBLPROPERTIES ('winner');

-- 设置位置
ALTER TABLE student_info_test SET LOCATION 'cosn://<your_bucket_name>//test_alter_table/new_location';

-- 设置 SERDE 属性
ALTER TABLE student_info_test SET SERDEPROPERTIES ('key1' = 'val1');


-- RECOVER PARTITIONS
CREATE EXTERNAL TABLE recover_part_test (id INT, name STRING, score INT)
PARTITIONED BY (subject STRING)
STORED AS PARQUET
LOCATION 'cosn://<your_bucket_name>//test_alter_table/recover_part_test';
ALTER TABLE recover_part_test ADD PARTITION (subject='math');
INSERT INTO recover_part_test PARTITION (subject='math') VALUES (1, 'Charlie', 95), (2, 'Diana', 88);
INSERT INTO recover_part_test PARTITION (subject='physics') VALUES (3, 'Eve', 92), (4, 'Frank', 78);
SELECT * FROM recover_part_test;
SHOW PARTITIONS recover_part_test;
ALTER TABLE recover_part_test RECOVER PARTITIONS;
SHOW PARTITIONS recover_part_test;