功能描述
TDSQL Boundless 的
ALTER TABLE 语句除支持 MySQL 标准操作(增删列、增删索引、修改列定义等)外,还扩展了分区策略管理、存储层级设置、TTL 生命周期配置、分区 DDL 与全局索引维护等能力。本文介绍 TDSQL Boundless 特有的 ALTER TABLE 语法及示例。语法
alter_table_stmt:ALTER TABLE table_name USING PARTITION POLICY partition_policy_name| ALTER TABLE table_name DROP PARTITION POLICY [FORCE]| ALTER TABLE table_name STORAGE_TIER [=] {AUTO_STORAGE | LOCAL_STORAGE | OBJECT_STORAGE}| ALTER TABLE table_name MODIFY PARTITION (partition_name [, partition_name ...]) STORAGE_TIER [=] {AUTO_STORAGE | LOCAL_STORAGE | OBJECT_STORAGE}| ALTER TABLE table_name MODIFY SUBPARTITION (subpartition_name [, subpartition_name ...]) STORAGE_TIER [=] {AUTO_STORAGE | LOCAL_STORAGE | OBJECT_STORAGE}| ALTER TABLE table_name DROP PARTITION partition_name [, partition_name ...] [UPDATE GLOBAL INDEXES]| ALTER TABLE table_name TRUNCATE PARTITION {ALL | partition_name [, partition_name ...]} [UPDATE GLOBAL INDEXES]| ALTER TABLE table_name TTL [=] time_column + INTERVAL value interval_unit| ALTER TABLE table_name TTL_ENABLE [=] 'ON' | 'OFF'| ALTER TABLE table_name TTL_JOB_INTERVAL [=] 'string_value'| ALTER TABLE table_name TTL_ARCHIVE_TABLE [=] 'string_value'| ALTER TABLE table_name TTL_ARCHIVE_ON_CONFLICT [=] 'STOP' | 'REPLACE'| ALTER TABLE table_name REMOVE TTL| ALTER TABLE table_name SET INTERVAL({ interval_type, N | N })| ALTER TABLE table_name SET INTERVAL()
参数说明
参数 | 是否必选 | 说明 |
ALTER TABLE table_name USING PARTITION POLICY partition_policy_name | 可选 | 修改表绑定的分区亲和性策略,其中 table_name跟partition_policy_name需要显式指定。 |
ALTER TABLE table_name DROP PARTITION POLICY [FORCE] | 可选 | 解绑表绑定的分区亲和性策略。 table_name 需显式指定。FORCE 选项:若指定,则执行成功后,当前表不再绑定任何亲和性策略。 若不指定,则会尝试解绑当前表已绑定的显式亲和性策略,再将其绑定可能的隐式亲和性策略。 |
ALTER TABLE table_name STORAGE_TIER [=] | 可选 | 修改表级的存储层级,用于声明数据对象在冷热分层存储中的存放位置。取值如下: AUTO_STORAGE:自动模式,由系统根据冷热分层策略及实例的默认存储层自动决定数据对象的存储位置。 LOCAL_STORAGE:本地存储,数据对象存放在本地磁盘,适用于热数据,访问延迟低。OBJECT_STORAGE:对象存储,数据对象存放在对象存储中,适用于冷数据归档,存储成本低。修改后仅影响后续新生成的数据对象的存储位置,已存在数据对象的迁移由系统按照冷热分层策略异步执行。 |
ALTER TABLE table_name MODIFY PARTITION (partition_name [, partition_name ...]) STORAGE_TIER [=] | 可选 | 修改指定分区的存储层级,支持一次指定一个或多个分区,分区级声明优先于表级。典型场景:将历史分区归档至对象存储以降低存储成本,或将热点分区迁回本地存储以降低访问延迟。 说明事项: partition_name 需为已存在的分区名,仅支持显式分区表。修改后仅影响后续新生成的数据对象的存储位置,已存在数据对象的迁移由系统按照冷热分层策略异步执行。 |
ALTER TABLE table_name MODIFY SUBPARTITION (subpartition_name [, subpartition_name ...]) STORAGE_TIER [=] | 可选 | 修改指定子分区的存储层级,支持一次指定一个或多个子分区。仅适用于子分区表(即使用了 SUBPARTITION BY 的分区表),对非子分区表使用会报错。说明事项: subpartition_name 需为已存在的子分区名。子分区级声明优先于分区级和表级声明。 修改后仅影响后续新生成的数据对象的存储位置,已存在数据对象的迁移由系统按照冷热分层策略异步执行。 |
ALTER TABLE table_name DROP PARTITION ... [UPDATE GLOBAL INDEXES] ALTER TABLE table_name TRUNCATE PARTITION ... [UPDATE GLOBAL INDEXES] | 可选 | 在执行 DROP PARTITION 或 TRUNCATE PARTITION 的同时,同步重建表上的全局二级索引(GSI),使全局二级索引在 DDL 完成后保持可用状态。不指定 UPDATE GLOBAL INDEXES 子句:分区操作完成后,受影响表的所有全局二级索引会被标记为不可用,后续查询无法使用相关索引(包括 FORCE INDEX 提示),需要单独重建索引或重新创建索引才能恢复使用。指定 UPDATE GLOBAL INDEXES 子句:DDL 执行过程中会同步重建全局二级索引,完成后全局二级索引保持可用状态,且数据与表中实际行保持一致。该子句仅作用于全局二级索引(含普通 GSI 和分区 GSI),不影响本地索引。如果表上不存在全局二级索引,该子句不会产生额外作用。 |
ALTER TABLE table_name TTL [=] time_column + INTERVAL value interval_unit | 可选 | 修改表的 TTL 配置。可修改 TTL 时间列、保留时长或时间单位。 time_column:用于判断是否过期的时间列,必须为 DATE、DATETIME 或 TIMESTAMP 类型,且定义为 NOT NULL。value:保留时长数值。unit:时间单位,支持 YEAR、MONTH、WEEK、DAY、HOUR、MINUTE。修改后,新的调度任务会按新配置生效。 |
ALTER TABLE table_name TTL_ENABLE [=] 'ON' | 'OFF' | 可选 | 启用或暂停表的 TTL 功能。 ON:启用,系统将按 TTL_JOB_INTERVAL 指定的间隔定期清理过期数据。OFF:暂停,系统不会为该表下发新的清理任务,但不影响已正在执行的任务。 |
ALTER TABLE table_name TTL_JOB_INTERVAL [=] 'string_value' | 可选 | 修改 TTL 任务的调度执行间隔。格式为 <数字><单位>,单位支持 s(秒)、m(分钟)、h(小时)、d(天)。例如 30m 表示每30分钟执行一次。 |
ALTER TABLE table_name TTL_ARCHIVE_TABLE [=] 'string_value' | 可选 | 绑定、变更或解绑 TTL 归档目标表。 绑定:指定归档表全限定名( db.table 或 table),过期数据将先写入归档表再从源表删除。变更:指定新的归档表名即可切换归档目标。 解绑:设为空字符串 '',解绑后该表回退为直接删除模式。归档表必须预先存在,且与源表结构兼容。源表必须有显式主键。 |
ALTER TABLE table_name TTL_ARCHIVE_ON_CONFLICT [=] 'STOP' | 'REPLACE' | 可选 | 修改 TTL 归档表在遇到主键/唯一键冲突时的处理方式: STOP (默认值):使用 insert 语句向归档表插入数据,和归档表的存量数据遇到主键/唯一键冲突时,会停止归档并取消 TTL 任务,需要人工介入确认冲突并解除冲突后方可继续归档; REPLACE: 使用 replace into 语句向归档表插入数据,遇到主键/唯一键冲突时会直接覆盖原有冲突行并写入归档数据,不会停止归档;需要用户明确归档表数据可覆盖时方可使用,生产场景谨慎使用。 |
ALTER TABLE table_name REMOVE TTL | 可选 | 移除表的 TTL 配置。执行后,表不再参与 TTL 自动清理。如果该表配置了 TTL_ARCHIVE_TABLE,执行 REMOVE TTL 时会一并清除归档绑定。 |
ALTER TABLE table_name SET INTERVAL(...) | 可选 | 为已有 RANGE 分区表(含 RANGE COLUMNS)追加或修改 INTERVAL 步长声明,声明后 INSERT 遇到超出现有分区范围的值时会自动创建所需分区,纯元数据操作,不涉及数据搬迁。自 V21.6.4.0 及以上版本支持。 interval_type:时间间隔类型,支持 YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND,仅用于 RANGE COLUMNS 单列,且分区列为日期时间类型时。N:间隔数值,必须为正整数常量,且 > 0。SECOND 类型时 N 不能小于60。省略 interval_type 时按整数步长处理,仅适用于分区表达式返回值为整数的场景。两个参数都不设置时,代表清除分区表上的 interval 属性。清除后,不再支持超出现有分区范围时自动创建所需分区的能力。 仅支持顶层 RANGE/RANGE COLUMNS 分区表可设置,LIST/HASH/KEY 分区表设置会报错。若为二级分区表,仅支持二级分区为 HASH / KEY 类型。详细语法、系统变量及使用限制请参见 创建 INTERVAL RANGE 分区。 |
示例
修改与解绑亲和性策略的操作。
# 创建分区亲和性策略pp1tdsql [demo]> create partition policy pp1 partition by hash(int) partitions 4;Query OK, 0 rows affected (0.02 sec)# 创建hash 4分区的表ttdsql [demo]> create table t(id INT) partition by hash(id) partitions 4;Query OK, 0 rows affected (0.90 sec)# 将表t绑定到分区亲和性策略pp1tdsql [demo]> alter table t using partition policy pp1;Query OK, 0 rows affected (0.64 sec)# 解绑表t的分区亲和性,完成后表t会被自动绑定到对应的隐式亲和性策略tdsql [demo]> alter table t drop partition policy;Query OK, 0 rows affected (0.66 sec)# 彻底解绑表t的分区亲和性策略,完成后表t不绑定任何分区亲和性策略tdsql [demo]> alter table t drop partition policy force;Query OK, 0 rows affected (0.61 sec)
修改表级的存储层,将整张表的存储层设为本地存储。
tdsql [demo]> ALTER TABLE t1 STORAGE_TIER = LOCAL_STORAGE;Query OK, 0 rows affected
修改分区级的存储层,将指定分区的存储层设为对象存储。
# 将分区p1归档至对象存储tdsql [demo]> ALTER TABLE t1 MODIFY PARTITION (p1) STORAGE_TIER = OBJECT_STORAGE;Query OK, 0 rows affected# 一次将多个历史分区归档至对象存储tdsql [demo]> ALTER TABLE t1 MODIFY PARTITION (p0, p1) STORAGE_TIER = OBJECT_STORAGE;Query OK, 0 rows affected
修改分区时同步重建全局二级索引。
# 创建带全局二级索引的分区表tdsql [demo]> CREATE TABLE orders (id INT NOT NULL,user_id INT NOT NULL,created_date DATE NOT NULL,PRIMARY KEY (id, created_date),INDEX gsi_user (user_id) GLOBAL) PARTITION BY RANGE (TO_DAYS(created_date)) (PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')),PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01')));Query OK, 0 rows affected# 删除指定分区,并同步重建全局二级索引;DDL 完成后 gsi_user 仍可用tdsql [demo]> ALTER TABLE orders DROP PARTITION p202401 UPDATE GLOBAL INDEXES;Query OK, 0 rows affected# 清空指定分区,并同步重建全局二级索引tdsql [demo]> ALTER TABLE orders TRUNCATE PARTITION p202402 UPDATE GLOBAL INDEXES;Query OK, 0 rows affected# 不指定 UPDATE GLOBAL INDEXES 时,gsi_user 会被标记为不可用tdsql [demo]> ALTER TABLE orders DROP PARTITION p202403;Query OK, 0 rows affected, 1 warning
修改分区时同步重建分区全局二级索引。
# 创建带分区全局二级索引(分区 GSI)的分区表tdsql [demo]> CREATE TABLE orders2 (id INT NOT NULL,user_id INT NOT NULL,amount DECIMAL(10,2),created_date DATE NOT NULL,PRIMARY KEY (id, created_date),INDEX gsi_amount (amount)GLOBAL PARTITION BY HASH(amount) PARTITIONS 8) PARTITION BY RANGE (TO_DAYS(created_date)) (PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')),PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01')));Query OK, 0 rows affected# 清空分区,同步重建分区 GSI;DDL 完成后 gsi_amount 及其子索引均可用tdsql [demo]> ALTER TABLE orders2 TRUNCATE PARTITION p202402 UPDATE GLOBAL INDEXES;Query OK, 0 rows affected
修改 TTL 保留时长。
# 将保留时长从 7 天修改为 30 天tdsql [demo]> ALTER TABLE operation_log TTL = created_at + INTERVAL 30 DAY;Query OK, 0 rows affected
启停 TTL 功能。
# 暂停 TTLtdsql [demo]> ALTER TABLE operation_log TTL_ENABLE = 'OFF';Query OK, 0 rows affected# 恢复 TTLtdsql [demo]> ALTER TABLE operation_log TTL_ENABLE = 'ON';Query OK, 0 rows affected
修改 TTL 调度间隔。
# 将调度间隔从 1 小时改为 30 分钟tdsql [demo]> ALTER TABLE operation_log TTL_JOB_INTERVAL = '30m';Query OK, 0 rows affected
绑定、变更和解绑归档表。
# 绑定归档表tdsql [demo]> ALTER TABLE orders TTL_ARCHIVE_TABLE = 'orders_history';Query OK, 0 rows affected# 变更归档表为跨库目标tdsql [demo]> ALTER TABLE orders TTL_ARCHIVE_TABLE = 'archive_db.orders_history';Query OK, 0 rows affected# 修改TTL的归档行为tdsql [demo]> ALTER TABLE orders TTL_ARCHIVE_ON_CONFLICT = 'STOP';Query OK, 0 rows affected# 解绑归档表,回退为直接删除模式tdsql [demo]> ALTER TABLE orders TTL_ARCHIVE_TABLE = '';Query OK, 0 rows affected
移除 TTL 配置。
tdsql [demo]> ALTER TABLE operation_log REMOVE TTL;Query OK, 0 rows affected
为已有 RANGE 表追加 INTERVAL 属性,之后 INSERT 越界数据将自动创建所需分区。
# 创建一张不带 interval 属性的普通 RANGE 表tdsql [demo]> CREATE TABLE t_range (id BIGINT NOT NULL PRIMARY KEY) PARTITION BY RANGE(id) (PARTITION p0 VALUES LESS THAN (1000));Query OK, 0 rows affected# 追加整数步长 100tdsql [demo]> ALTER TABLE t_range SET INTERVAL(100);Query OK, 0 rows affected# 写入超出现有分区范围的数据,自动创建所需分区tdsql [demo]> INSERT INTO t_range VALUES (1050);Query OK, 1 row affected
清除 INTERVAL 属性,降级为普通 RANGE 表。
tdsql [demo]> ALTER TABLE t_range SET INTERVAL();Query OK, 0 rows affected# 清除后,越界写入不再自动建分区,直接报错tdsql [demo]> INSERT INTO t_range VALUES (2000);ERROR 1526 (HY000): Table has no partition for value 2000