-- 添加单列
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 |
+----+-------+--------+
⚠️
DEFAULT
DEFAULT
值不回填历史数据,已有行的新列值为 NULL。如需回填,执行
UPDATE ... SET status = 'active' WHERE status IS NULL
UPDATE ... SET status = 'active' WHERE status IS 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 |
+----+-------+------------+
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;
-- 删除指定分区(分区数据一并删除)
ALTER TABLE events DROP PARTITION (dt='2024-01');
-- 幂等删除(不存在不报错)
ALTER TABLE events DROP IF EXISTS PARTITION (dt='2024-01');
SHOW PARTITIONS events;
-- 清除注释: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;