StarRocks ddl语法

1表结构变更分类
StarRocks非常友好的支持了Online Schema Change,让我们在日常业务中变更维度时无需重启服务,更无需重导历史数据。

在前面所举的例子中其实已经涉及到了一些Schema Change的场景,比如增加索引、修改分区、修改表属性等。在分布式表中,Schema Change的限制是比较多的,有些情况还会是一个比较重的操作。

StarRocks中目前进行schema change的方式有三种:sorted schema change,direct schema change和linked schema change。

1.1 sorted schema change
sorted schema change会改变列的排序方式,需对数据进行重新排序。例如删除排序列中的一列,字段重排序,例如:

ALTER TABLE site_visit DROP COLUMN city;

1.2 direct schema change
direct schema change时无需重新排序,但是需要对数据做一次转换。例如修改列的类型,在前缀索引中加一列等。

ALTER TABLE site_visit MODIFY COLUMN username varchar(64);

1.3 linked schema change
linked schema change下无需转换数据,直接完成。例如加列操作:

ALTER TABLE site_visit ADD COLUMN click bigint SUM default '0';

StarRocks的schema change均为异步操作,我们可以通过show语句查看当前的状态:

SHOW ALTER TABLE COLUMN;

schema change默认的超时时间为86400秒(1天),查看方式:

ADMIN SHOW FRONTEND CONFIG;

若发现Schema Change比较耗时,我们可以增加该超时时间,比如增加到10天:

ADMIN SET FRONTEND CONFIG ("alter_table_timeout_second" = "864000");

当进行的Schema Change任务为较重的操作时,有可能因为BE分配给Schema Change的内存不足导致更改失败,这时我们可以在be.conf中增大任务内存,默认为2G,可以适当增大:

memory_limitation_per_thread_for_schema_change=5

2增加列
在为表增加列时,语法为:

ALTER TABLE tablename ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"] [AFTER column_name|FIRST] [PROPERTIES ("key"="value", ...)];

其中,方括号表示可选,竖杠表示或。这里注意:

1)聚合模型如果增加value列,需要指定聚合类型;

2)非聚合模型(如DUPLICATE KEY)如果增加key列,需要指定KEY关键字;

3)希望增加多列时,需要等待一列增加完成后再增加另一列。

例如,我们为聚合模型表table01增加一个value列uv,其详细信息为:

uv INT COUNT DEFAULT "0" COMMENT "unique visitor"

增加语句:

ALTER TABLE table01 ADD COLUMN uv INT SUM DEFAULT "0" COMMENT "unique visitor";

为table01再增加一个key列event_type:

event_type INT NOT NULL COMMENT "type of event"

SQL语句为(非空列需设置一个默认值,增加后列的位置为value列前的最后一列):

ALTER TABLE table01 ADD COLUMN event_type INT NOT NULL DEFAULT "0" COMMENT "type of event";

在明细模型表table02的event_type列后新增一个key列status,其详细信息为:

status INT NULL

新增语句:

ALTER TABLE table02 ADD COLUMN status INT KEY NULL AFTER event_type;

3删除列
删除列的语法为:

ALTER TABLE tablename DROP COLUMN column_name;

注意:不能删除分区分桶列。

也举一个例子,比如删除table01中的event_type列:

ALTER TABLE table01 DROP COLUMN event_type;

4修改列
修改列时的语法较为复杂:

ALTER TABLE tablename MODIFY COLUMN column_name column_type [KEY | agg_type] [NULL | NOT NULL] [DEFAULT "default_value"] [COMMENT "注释"] [AFTER column_name|FIRST] [PROPERTIES ("key"="value", ...)];

注意:

1)聚合模型如果修改value列,需要指定当前的聚合类型;

2)非聚合类型如果修改key列,需要指定KEY关键字;

3)只能修改列的类型、注释和位置,不支持修改列名和默认值,所以在修改列时,列名和默认值需在修改语句中按照原属性显式的写出;

4)只支持从NOT NULL转为NULL,不支持从NULL转为NOT NULL;

5)分区列及分桶列不能做任何修改;

6)目前支持以下类型的转换(精度损失由用户保证)

TINYINT/SMALLINT/INT/BIGINT转换成TINYINT/SMALLINT/INT/BIGINT/DOUBLE;
TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL转换成 VARCHAR;
VARCHAR支持修改最大长度;
VARCHAR转换成TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE;
VARCHAR转换成DATE(目前支持"%Y-%m-%d","%y-%m-%d","%Y%m%d","%y%m%d","%Y/%m/%d","%y/%m/%d"六种格式化格式);
DATETIME转换成DATE(仅保留年-月-日信息,例如:`2019-12-09 21:47:05` <--> `2019-12-09`);
DATE转换成DATETIME(时分秒自动补零,例如:`2019-12-09` <--> `2019-12-09 00:00:00`);
FLOAT转换成DOUBLE;
INT转换成DATE(如果INT类型数据不合法则转换失败,原始数据不变)。
例如,修改table01 total列的字段类型为DECIMAL(20,2):

ALTER TABLE table01 MODIFY COLUMN total DECIMAL(20,2) SUM DEFAULT "0" COMMENT "total amount of equipment";

修改table02的event_type列,将类型修改为BIGINT,允许空值,注释改为“已修改”,且将其位置修改为在user_id列的后面:

ALTER TABLE table02 MODIFY COLUMN event_type BIGINT KEY NULL COMMENT "已修改" AFTER user_id;

5原子替换及Create table like
在聊完表结构变更后,再引申两个比较常用的命令:

1、修改表名

ALTER TABLE table01 RENAME new_table01;

2、原子替换

可以理解为将两个表的名字交换,原子替换过程中不影响导入和查询。例如将table01与table02原子替换:

ALTER TABLE table01 SWAP WITH table02;

3、Create table like

StarRocks支持根据一张表(也支持外部表)创建另一张表结构完全相同的空表,新表复制的表结构包括Column Defination、Partitions、Table Properties等(不包括物化视图)。创建语法为:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name LIKE [database.]table_name;

例如,在starrocks库下创建一张表结构和table01相同的空表,表名为table01_2:

CREATE TABLE starrocks.table01_2 LIKE starrocks.table01;

原文链接:https://blog.csdn.net/ult_me/article/details/122313391

猜你喜欢

转载自blog.csdn.net/ths512/article/details/125620486