ALTER TABLE

ALTER TABLE语法用于修改表的结构,例如增加列、删除列、修改列的数据类型、新增表属性等。本文介绍ALTER TABLE语法在不同引擎中的使用方法和差异。

引擎与版本

ALTER TABLE语法适用于宽表引擎和时序引擎。无版本限制。

注意事项

ALTER TABLE操作不会锁定表,在执行DDL操作过程中整个表都是可以正常读写的。在读写过程中,可能会遇到超时报错或轻微抖动和毛刺,可能是由于以下原因:

  • DDL操作变更时,每个分片都会先关闭再打开并重新加载元数据,该过程耗时很短,通常在十毫秒至数百毫秒之间。如果在该过程恰好有请求发送至重新打开的分片,则此时请求可能会有轻微抖动或毛刺,建议您在业务低峰期执行DDL变更操作。

  • 所有DDL操作都会在分片完成变更后才会返回执行结果,因此在对规模较大的表执行DDL操作时,由于客户端超时时间较短,可能会遇到超时报错,但实际上DDL操作会在服务器上继续执行直至完成。

语法

alter_table_statement   ::=  ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::=  ADD [COLUMN] column_name type [TAG]
                             | DROP COLUMN [ IF EXISTS ] column_name
                             | SET table_options
                             | COMPACT (idcName)?

差异说明

Lindorm宽表引擎和时序引擎的ALTER TABLE语法差异较大。差异对比请参见下表。

语法要素

宽表引擎

时序引擎

ADD COLUMN

COMPACT

说明

宽表引擎2.3.4及以上版本支持。

✖️

DROP COLUMN

说明

宽表引擎2.6.6及以上版本支持。

✖️

SET table_options

✖️

使用说明

ADD COLUMN(新增列)

宽表引擎和时序引擎均支持ADD COLUMN。

新增列有以下规则:

  • 新增的列不能声明为主键。

  • 针对时序引擎,只支持新增标签列(TAG)和量测值列(FIELD),不支持新增时间戳列。

DROP COLUMN(删除列)

仅版本为2.6.6及以上版本的宽表引擎支持DROP COLUMN。

说明

如果您无法通过控制台升级至2.6.6及以上版本,请联系Lindorm技术支持(钉钉号:s0s3eg3)。

DROP COLUMN操作是异步执行的,ALTER TABLE语句执行成功后系统会立刻删除目标列,但列中的数据在系统完成COMPACT操作后才会被清理。如果您需要加速数据清理进程,可以手动执行FLUSHCOMPACT操作。同时,在数据完成清理前,您无法添加同名列。具体操作及说明,请参见常见问题

SET table_options(设置表属性)

宽表引擎支持SET table_options。

具体的表属性列表,请参见表属性。您可以通过SHOW TABLE VARIABLES语句验证表属性是否设置成功,详细介绍请参见SHOW TABLE VARIABLES

重要

修改MUTABILITY和CONSISTENCY属性,有以下两点注意事项:

  • 创建索引之前,支持修改MUTABILITY和CONSISTENCY。

  • 创建索引之后:

    • 无法修改MUTABILITY

    • 仅支持将CONSISTENCY的值从eventual修改为strong,但不支持从strong修改为eventual

示例请参见开启动态列

COMPACT(强制执行Major Compaction)

仅版本为2.3.4及以上版本的宽表引擎支持Major Compaction。

执行Major Compaction操作,会合并数据文件,清理已删除或过期的数据,释放磁盘空间,提高读写性能,但Major Compaction操作会占用系统资源。

  • 不指定idcName:

    • 对单可用区实例来说,因为只有一个IDC,是否指定idcName没有区别。

    • 对多可用区实例来说,有2个IDC,不指定idcName时Major Compaction操作的执行规则如下:

      • 宽表引擎版本低于2.6.4.2:只会对idc1进行Major Compaction。

      • 宽表引擎为2.6.4.2及以上版本:默认对所有的IDC进行Major Compaction。

  • 指定idcName,表示对指定IDC进行Major Compaction。idcName可指定多个,多个idcName之间用半角逗号(,)分隔。

示例请参见执行Major Compaction

示例

本文提供的示例基于CREATE TABLE文档的建表示例语句。

CREATE TABLE sensor (
    device_id VARCHAR NOT NULL,
    region VARCHAR NOT NULL,
    time BIGINT NOT NULL,
    temperature DOUBLE,
    humidity BIGINT,
    PRIMARY KEY(device_id, region, time)
);

新增列

为表sensor新增一个列n1

ALTER TABLE sensor ADD COLUMN n1 DOUBLE;

删除列

为表sensor删除列n1

ALTER TABLE sensor DROP COLUMN IF EXISTS n1;

结果验证

执行以下语句可以验证操作结果。

DESCRIBE table sensor;

开启动态列

开启sensor表的动态列。

ALTER TABLE sensor SET DYNAMIC_COLUMNS = 'true';
说明

关于动态列的介绍,请参见动态列

设置数据有效期

  • sensor表设置数据有效期,时间单位为秒(s)。

    ALTER TABLE sensor SET TTL = '2592000';
  • sensor表取消数据有效期。

    ALTER TABLE sensor SET TTL = '';

    结果验证

    在集群管理系统的概览页面,单击目标数据库下的目标表名,可在当前详情表格区域,查看ttl参数的值。如何进入集群管理系统,请参见登录集群管理系统

设置压缩算法

  • 设置sensor表的压缩算法为ZSTD

    ALTER TABLE sensor SET COMPRESSION = 'ZSTD';
  • 设置sensor表的压缩算法为NONE

    ALTER TABLE sensor SET COMPRESSION = 'NONE';

    结果验证

    在集群管理系统的概览页面,单击目标数据库下的目标表名。在当前详情表格区域,单击查看表属性,查看COMPRESSION参数的值。

设置冷热分离

说明

关于冷热分离的介绍,请参见冷热分离介绍

设置冷热分界线

按时间戳冷热分离

设置表sensor表的冷热分界线。宽表引擎会基于每一行数据实际写入数据库的时间戳(入库时间戳)来计算是否需要将该数据归档至容量型云存储。

-- 为表sensor开启按按时间戳冷热分离,设置冷热分离时间点为一天。
ALTER TABLE sensor SET CHS = '86400', CHS_L2 = 'storagetype=COLD';

结果验证

您可以通过SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';语句,查看CHSCHS_L2参数的值。SHOW VARIABLES语法的详细介绍,请参见SHOW VARIABLES

按自定义时间列冷热分离

重要

按自定义时间列冷热分离对自定义时间列存在限制和要求,在使用前请阅读相关注意事项,具体内容请参见注意事项

将自定义时间列time设置为表sensor的冷热分界线。宽表引擎会基于每一行数据的time列的时间戳(业务时间戳),来计算是否需要将该数据归档至容量型云存储。

-- 为表sensor开启按自定义列冷热分离,设置冷热分离时间点为一天,并按time列冷热分离。
ALTER TABLE sensor SET CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=time';

结果验证

您可以通过SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';语句,查看CHSCHS_L2CHS_COLUMN参数的值。SHOW VARIABLES语法的详细介绍,请参见SHOW VARIABLES

取消冷热分界线

取消sensor表的冷热分界线。

ALTER TABLE sensor SET CHS = '', CHS_L2 = '';

结果验证

您可以通过SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';语句,查看CHSCHS_L2参数的值。SHOW VARIABLES语法的详细介绍,请参见SHOW VARIABLES

执行Major Compaction

  • 对sensor表执行Major Compaction。

    ALTER TABLE sensor COMPACT;
    说明

    如果实例为多可用区实例,需注意以下规则:

    • 如果宽表引擎版本低于2.6.4.2版本,未指定IDC时,系统默认对idc1进行Major Compaction。

    • 如果宽表引擎为2.6.4.2及以上版本,系统默认对所有的IDC进行Major Compaction。

  • 对idc2执行Major Compaction。

    ALTER TABLE sensor COMPACT 'idc2';
  • 对idc1和idc2执行Major Compaction。

    ALTER TABLE sensor COMPACT 'idc1,idc2';

=