ALTER TABLE
)添加一个具有指定名称、类型、编码和默认表达式的新列到表中。
语法
ALTER TABLE [tableIdentifier] ADD COLUMN [IF NOT EXISTS] [tableColumnDfnt] [AFTER name_after]
IF NOT EXISTS
子句,则如果列已经存在,查询不会返回错误。AFTER name_after
(另一个列的名称),则该列将添加在指定列之后。如果希望将列添加到表的开头,请使用 FIRST
子句。否则,列将被添加到表的末尾。对于一系列操作,name_after
可以是先前操作中添加的列的名称。示例
-- Step 1: create a table CREATE TABLE db_name.table_name ( `order_by_column ` String ) ENGINE = `CnchMergeTree` ORDER BY (`order_by_column `) -- Step 2: add column ALTER TABLE db_name.table_name ADD COLUMN IF NOT EXISTS column_name String COMMENT 'column comment here' AFTER order_by_column
语法
ALTER TABLE [tableIdentifier] MODIFY COLUMN [IF EXISTS] [tableColumnDfnt]
示例
-- Step 1: create a table CREATE TABLE db_name.table_name ( `order_by_column ` String, `normal_column` Int64 DEFAULT 0 ) ENGINE = `CnchMergeTree` ORDER BY (`order_by_column `) -- Step 2: modify column normal_column_name & update its data type, comment and default value ALTER TABLE db_name.table_name MODIFY COLUMN IF EXISTS normal_column String DEFAULT 'new_default_value' COMMENT 'new comment'
移除一个表的属性: **`DEFAULT`**, **`ALIAS`**, **`MATERIALIZED`**, **`CODEC`**, **`COMMENT`**, **`TTL`**, **`SETTINGS`**.
语法
ALTER TABLE table_name MODIFY COLUMN column_name REMOVE property;
示例Remove TTL
ALTER TABLE table_with_ttl MODIFY COLUMN column_ttl REMOVE TTL;
修改一个表的参数设置
语法
ALTER TABLE table_name MODIFY COLUMN column_name MODIFY SETTING name=value,...;
示例
修改字段 max_compress_block_size
到 1MB
:
ALTER TABLE table_name MODIFY COLUMN column_name MODIFY SETTING max_compress_block_size = 1048576;
重置列参数设置,同时移除表 CREATE 语句列表达式的参数设置声明。
语法
ALTER TABLE table_name MODIFY COLUMN column_name RESET SETTING name,...;
示例
重设置表参数 max_compress_block_size
为 default 值:
ALTER TABLE table_name MODIFY COLUMN column_name RESET SETTING max_compress_block_size;
删除表中的一列。Partition by columns 和 order by columns 不允许删除。
语法
ALTER TABLE [tableIdentifier] DROP COLUMN [IF EXISTS] column_name;
IF EXISTS
子句,如果列不存在,查询将不会返回错误。示例
-- Step 1: create a table CREATE TABLE db_name.table_name ( `order_by_column` String, `normal_column` Int64 ) ENGINE = `CnchMergeTree` ORDER BY (`order_by_column`) -- Step 2: drop the normal column ALTER TABLE db_name.table_name DROP COLUMN IF EXISTS normal_column
重命名表中的列。使用时有一些注意事项:
语法
ALTER TABLE [tableIdentifier] RENAME COLUMN [IF EXISTS] column_name_from TO column_name_to;
IF EXISTS
子句,如果列不存在,查询将不会返回错误。示例
-- Step 1: create a table CREATE TABLE db_name.table_name ( `order_by_column` String, `old_column_name` Int64 ) ENGINE = `CnchMergeTree` ORDER BY (`old_column_name`) -- Step 2: rename column ALTER TABLE db_name.table_name RENAME COLUMN old_column_name TO new_column_name
重置指定分区的列中的所有数据
语法
CLEAR COLUMN [IF EXISTS] name IN PARTITION partition_name
示例
ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple()
注释一个列
语法
COMMENT COLUMN [IF EXISTS] name 'Text comment'
示例
ALTER TABLE visits COMMENT COLUMN browser 'This column shows the browser used for accessing the site.'
将分区或数据部分移动到分离目录并忘记它。
语法
ALTER TABLE table_name DETACH PARTITION|PART partition_expr
将指定分区的所有数据移动到分离目录。服务器会将该分离的数据分区视为不存在。在执行 ATTACH 查询之前,服务器不会知道这些数据的存在。
示例
ALTER TABLE mt DETACH PARTITION '2020-11-21'; ALTER TABLE mt DETACH PART 'all_2_2_0';
查询执行后,您可以对分离目录中的数据进行任何操作——将其从文件系统中删除,或仅将其保留。
删除分区或数据部分。
语法
ALTER TABLE table_name DROP PARTITION|PART partition_expr
从表中删除指定的分区。此查询将分区标记为非活动状态,并在大约10分钟内完全删除数据。
示例
ALTER TABLE mt DROP PARTITION '2020-11-21'; ALTER TABLE mt DROP PART 'all_4_4_0';
从分离目录中移除指定的部分或指定分区的所有PART
语法
ALTER TABLE table_name DROP DETACHED PARTITION|PART partition_expr
如果分区为空,则删除分区元数据。
语法
ALTER TABLE table_name FORGET PARTITION partition_expr
如果分区不为空或未知,查询将失败。请确保仅对将不再使用的分区执行此操作。
示例
ALTER TABLE mt FORGET PARTITION '20201121';
将分区或数据部分从分离目录添加到表中。
语法
ALTER TABLE table_name ATTACH PARTITION|PART partition_expr
将数据从分离目录添加到表中。可以为整个分区或单独的PART添加数据。
示例
ALTER TABLE visits ATTACH PARTITION 201901; ALTER TABLE visits ATTACH PART 201901_2_2_0;
将数据分区从一个表复制到另一个表并添加。
语法
ALTER TABLE table2 ATTACH PARTITION partition_expr FROM table1
此查询将数据分区从 table1 复制到 table2。 注意:
数据不会从 table1 或 table2 中删除。
table1 可以是一个临时表。
为了使查询成功运行,必须满足以下条件:
两个表必须具有相同的结构。
两个表必须具有相同的分区键、排序键和主键。
两个表必须具有相同的索引和投影。
两个表必须具有相同的存储策略。
将数据分区从一个表复制到另一个表并替换。
语法
ALTER TABLE table2 REPLACE PARTITION partition_expr FROM table1
此查询将数据分区从 table1 复制到 table2,并替换 table2 中现有的分区。该操作是原子的。 注意:
数据不会从 table1 中删除。
table1 可以是一个临时表。
为了使查询成功运行,必须满足以下条件:
两个表必须具有相同的结构。
两个表必须具有相同的分区键、排序键和主键。
两个表必须具有相同的索引和投影。
两个表必须具有相同的存储策略。
将数据分区从一个表移动到另一个表。
语法
ALTER TABLE table_source MOVE PARTITION partition_expr TO TABLE table_dest
此查询将数据分区从 table_source 移动到 table_dest,并从 table_source 中删除数据。 为了使查询成功运行,必须满足以下条件:
重置分区中指定列的值。
语法
ALTER TABLE table_name CLEAR COLUMN column_name IN PARTITION partition_expr
重置分区中指定列的所有值。如果在创建表时确定了 DEFAULT 子句,此查询会将列值设置为指定的默认值。
示例
ALTER TABLE visits CLEAR COLUMN hour in PARTITION 201902
重置分区中指定的二级索引。
语法
ALTER TABLE table_name CLEAR INDEX index_name IN PARTITION partition_expr
此查询与 CLEAR COLUMN 类似,但它重置的是索引,而不是列数据。
创建分区的备份。
语法
ALTER TABLE table_name FREEZE [PARTITION partition_expr] [WITH NAME 'backup_name']
此查询创建指定分区的本地备份。如果省略 PARTITION 子句,查询会一次性创建所有分区的备份。
移除分区的备份。
语法
ALTER TABLE table_name UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'
此查询创建指定分区的本地备份。如果省略 PARTITION 子句,查询将一次性备份所有分区。 移除磁盘上具有指定名称的冻结分区。如果省略 PARTITION 子句,查询将一次性移除所有分区的备份。
从另一台服务器下载分区或数据部分。
语法
ALTER TABLE table_name FETCH PARTITION|PART partition_expr FROM 'path-in-zookeeper'
从另一台服务器下载分区。此查询仅适用于复制表。
示例1:FETCH PARTITION
ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits'; ALTER TABLE users ATTACH PARTITION 201902;
示例2:FETCH PART
ALTER TABLE users FETCH PART 201901_2_2_0 FROM '/clickhouse/tables/01-01/visits'; ALTER TABLE users ATTACH PART 201901_2_2_0;
将分区或数据部分移动到另一个磁盘或卷。
语法
ALTER TABLE table_name MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'
示例
ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow' ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd'
按条件更新分区内的数据。
语法
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr
示例
-- using partition name ALTER TABLE mt UPDATE x = x + 1 IN PARTITION 2 WHERE p = 2; -- using partition id ALTER TABLE mt UPDATE x = x + 1 IN PARTITION ID '2' WHERE p = 2;
按条件删除分区内的数据。
语法
ALTER TABLE [db.]table DELETE [IN PARTITION partition_expr] WHERE filter_expr
示例
-- using partition name ALTER TABLE mt DELETE IN PARTITION 2 WHERE p = 2; -- using partition id ALTER TABLE mt DELETE IN PARTITION ID '2' WHERE p = 2;
可以使用此基本查询格式更新数据。不支持唯一表。请参阅“更新语句”。
语法
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr;
说明
ALTER TABLE
的前缀使这个语法与其他大多数支持SQL的系统不同。它的目的是表明,与OLTP数据库中的类似查询不同,这是一个繁重的操作,不是为频繁使用而设计。
**使用限制:**
filter_expr
必须是UInt8
类型。这个查询将指定列的值更新为行中相应表达式的值,对于这些行,filter_expr
取值为非零。使用CAST
操作符将数值映射到列的类型上。不支持更新用于计算主键或分区键的列。示例
alter table table_alter update bool=1 where uint8=21;
从表中删除数据。不支持唯一表。请参阅“删除语句”。
语法
ALTER TABLE [tableIdentifier] DELETE WHERE filter_expr;
说明
ALTER TABLE
前缀使得这个语法不同于大多数其他支持SQL的系统。它的目的是表示,与OLTP数据库中的类似查询不同,这是一个不为经常使用而设计的繁重操作。
**使用限制:**
filter_expr
的类型必须是UInt8
。该查询删除表中该表达式接受非零值的行。示例
alter table test_common delete where id=101
添加一个表的约束
语法
ALTER TABLE [tableIdentifier] ADD CONSTRAINT [IF NOT EXISTS] constraint_name CHECK columnExpr;
IF EXISTS
子句,如果约束不存在,查询将不会返回错误。示例
-- Step 1: create a table CREATE TABLE `example_table` ( `order_by_column` String ) ENGINE = `CnchMergeTree` ORDER BY (`order_by_column`) -- Step 2: add constraint check_str ALTER TABLE example_table ADD CONSTRAINT IF NOT EXISTS check_str CHECK order_by_column != 'forbidden_string'
语法
ALTER TABLE [tableIdentifier] DROP CONSTRAINT [IF EXISTS] constraint_name;
IF EXISTS
子句,如果约束不存在,查询将不会返回错误。示例
-- Step 1: create a table with the constraint check_str CREATE TABLE `example_table` ( `order_by_column` String, CONSTRAINT check_str CHECK order_by_column != 'forbidden_string' ) ENGINE = `CnchMergeTree` ORDER BY (`order_by_column`) -- Step 2: drop constraint check_str ALTER TABLE example_table DROP CONSTRAINT IF EXISTS check_str
这是一组更改表设置的操作。你可以修改设置或将其重置为默认值。单个查询可以同时更改多个设置。 如果指定名称的设置不存在,则查询会引发异常。
语法
ALTER TABLE [db].name MODIFY|RESET SETTING ...
更改表设置
语法
MODIFY SETTING setting_name=value [, ...]
示例
CREATE TABLE example_table (id UInt32, data String) ENGINE=CnchMergeTree() ORDER BY id; ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000;
重置表设置为默认值。如果设置处于默认状态,则不采取任何操作。
语法
RESET SETTING setting_name [, ...]
示例
CREATE TABLE example_table (id UInt32, data String) ENGINE=CnchMergeTree() ORDER BY id SETTINGS max_part_loading_threads=8; ALTER TABLE example_table RESET SETTING max_part_loading_threads;
可以使用以下操作:
--向表元数据添加索引描述 ALTER TABLE [db].name ADD INDEX name expression TYPE type GRANULARITY value [FIRST|AFTER name] --从表元数据中删除索引描述并从磁盘中删除索引文件 ALTER TABLE [db].name DROP INDEX name --查询在分区partition_name中重建二级索引name ALTER TABLE [db.]table MATERIALIZE INDEX name IN PARTITION partition_name
前两个命令是轻量级的,它们只更改元数据或删除文件。
更改表 TTL。TTL 子句中使用的列必须位于按列分区中。
语法
ALTER TABLE [tableIdentifier] MODIFY [ttlClause];
IF EXISTS
子句,如果列不存在,查询将不会返回错误。示例
-- Step 1: create a table with table TTL to be 1 day CREATE TABLE `example_table` ( `d` DateTime ) ENGINE = `CnchMergeTree` PARTITION BY d ORDER BY `d` TTL d + INTERVAL 1 DAY -- Step 2: modify table ttl & change the TTL to 2 month ALTER TABLE example_table MODIFY TTL d + INTERVAL 2 MONTH
移除表的TTL
语法
ALTER TABLE [tableIdentifier] REMOVE TTL;
示例
-- Step 1: create a table with table TTL to be 1 day CREATE TABLE `example_table` ( `d` DateTime ) ENGINE = `CnchMergeTree` PARTITION BY d ORDER BY d TTL d + INTERVAL 1 DAY -- Step 2: remove table ttl ALTER TABLE example_table REMOVE TTL
添加或更改集群属性。
语法
ALTER TABLE [tableIdentifier] MODIFY CLUSTER BY (column, expression, ...) INTO 64 BUCKETS