CREATE TABLE LIKE

更新时间:
复制 MD 格式

CREATE TABLE LIKE语句用于创建一个同Select Query结果相同的表。本文为您介绍CREATE TABLE LIKE的用法。

使用限制

  • Hologres V0.9及以下版本,CREATE TABLE LIKE语句仅支持复制表结构,不支持复制表属性(主键、索引等)。请在Hologres管理控制台的实例详情页查看当前版本。

  • Hologres V0.10版本开始,支持使用CREATE TABLE LIKE语句复制表结构和表属性(主键、索引等),但需要执行以下命令设置GUC。开启GUC后,CREATE TABLE LIKE只支持通过SELECT * FROM <table_name>复制表,不支持其他写法,如SELECT <column_1>, <column_2> FROM <table_name>。

    set hg_experimental_enable_create_table_like_properties=true;
  • 使用CREATE TABLE LIKE创建的表不会自动同步源表的数据。

  • 查询语句中的每一个目标列都要有一个不重复的别名,否则建表语句就会生成同列名的语句导致执行报错。示例如下:

    CALL hg_create_table_like('new_table', 'select *, 1 as c, ''a'' as c from src_table');
    ERROR:  column "c" specified more than once
    CONTEXT:  SQL statement "create table new_table (
    "a"     integer,
    "b"     text,
    "c"     integer,
    "c"     text
    );"
    PL/pgSQL function hg_create_table_like(text,text) line 22 at EXECUTE
  • CREATE TABLE LIKE语句支持复制列COMMENT(注释),支持复制Binlog属性,不支持复制表COMMENT和动态分区属性。从V3.0.33版本开始支持复制表COMMENT。

命令语法

在Hologres中,CREATE TABLE LIKE的命令格式如下:

-- 复制一张普通表,但不能复制表属性。逻辑分区表无法通过此方式复制分区属性
CALL hg_create_table_like('new_table_name', 'select_query');

-- 复制一张物理分区表,但不能复制其他表属性
CALL hg_create_table_like('new_table_name', 'select_query', 'partition_clause');

-- 复制一张表并复制表属性。逻辑分区表需要通过此方式复制分区属性
set hg_experimental_enable_create_table_like_properties=true; -- 开关参数,session级别
CALL hg_create_table_like('new_table_name', 'select * from old_table_name');
说明

通过调用hg_create_table_like,系统会根据select_query结果的schema创建一个表名为new_table_name的表,但不会插入任何数据。

参数说明

  • new_table_name:要创建表的表名(不支持创建外部表),只支持固定字符串,不支持字符拼接或函数生成等。

  • select_query:查询的SQL语句串。当SQL中的内容完全为select * from tablename时,CREATE TABLE LIKE会自动同步创建原表的所有属性,包括pk、索引等。如果SQL语句中有较多单引号,可以将$$符号置于SQL语句前后,通过$$query_sql$$改写(推荐使用该用法,操作更简便)自动实现单引号转义,用法如下:

    CALL HG_CREATE_TABLE_LIKE ('table_name', $$query_sql$$ [, 'partition_clause'])
  • partition_clause:分区相关的语法定义。用于指定分区键,不会自动创建分区子表,需要手动建分区子表。

  • old_table_name:需要复制的原表名。

使用示例

如在Hologres中存在如下源表:

BEGIN;
CREATE TABLE public.src_table (
 "a" int8 NOT NULL,
 "b" text NOT NULL,
PRIMARY KEY (a)
);
CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('public.src_table', 'bitmap_columns', 'b');
CALL SET_TABLE_PROPERTY('public.src_table', 'dictionary_encoding_columns', 'b:auto');
CALL SET_TABLE_PROPERTY('public.src_table', 'time_to_live_in_seconds', '3153600000');
CALL SET_TABLE_PROPERTY('public.src_table', 'distribution_key', 'a');
CALL SET_TABLE_PROPERTY('public.src_table', 'storage_format', 'segment');
COMMIT;

在Hologres中CREATE TABLE LIKE的示例用法如下:

  • 创建一个同源表结构和属性相同的表

    -- 复制表及属性
    set hg_experimental_enable_create_table_like_properties=true;
    CALL hg_create_table_like('new_table', 'select * from src_table');
  • 创建一个在源表的基础上再增加字段的表

    -- 新增一个同b一样的字段c
    CALL hg_create_table_like('holo_table_1', $$select *, "b" as c from src_table$$);
  • 创建一个物理分区表,并为其手动创建分区子表

    -- 新增一个字段ds,并将表设置为以ds为分区键的物理分区表
    CALL hg_create_table_like('new_table', $$select *, "b" as ds from src_table$$, 'partition by list(ds)');
    
    -- 为分区表创建分区子表
    create table new_table_child_20201213 partition of new_table for values in('20201213'); -- 以20201213为分区值
    create table new_table_child_20201214 partition of new_table for values in('20201214'); -- 以20201214为分区值
  • 基于分区表创建临时表,并将其绑定(ATTACH)为分区子表

    -- 创建分区父表
    BEGIN;
    CREATE TABLE public.src_parent_table (
     "a" int NOT NULL,
     "b" text NOT NULL,
    PRIMARY KEY (a,b)
    ) PARTITION BY LIST(a);
    CALL SET_TABLE_PROPERTY('public.src_parent_table', 'orientation', 'column');
    CALL SET_TABLE_PROPERTY('public.src_parent_table', 'bitmap_columns', 'b');
    CALL SET_TABLE_PROPERTY('public.src_parent_table', 'dictionary_encoding_columns', 'b:auto');
    CALL SET_TABLE_PROPERTY('public.src_parent_table', 'time_to_live_in_seconds', '3153600000');
    CALL SET_TABLE_PROPERTY('public.src_parent_table', 'distribution_key', 'a');
    CALL SET_TABLE_PROPERTY('public.src_parent_table', 'storage_format', 'segment');
    COMMIT;
    
    -- 创建分区子表
    CREATE TABLE public.src_child_table PARTITION OF public.src_parent_table FOR VALUES IN (20220101);
    
    -- 基于分区父表或分区子表创建继承表属性的表
    set hg_experimental_enable_create_table_like_properties=true;
    CALL hg_create_table_like('like_parent_table', 'select * from src_parent_table');
    CALL hg_create_table_like('like_child_table', 'select * from src_child_table');
    
    -- 将新表作为分区子表绑定(ATTACH)到分区父表
    ALTER TABLE src_parent_table ATTACH PARTITION like_parent_table FOR VALUES IN (20220102);
    ALTER TABLE src_parent_table ATTACH PARTITION like_child_table FOR VALUES IN (20220103);

HoloWeb可视化复制表

HoloWeb提供可视化复制表功能,无需写SQL命令就能复制表,步骤如下。

  1. 进入HoloWeb页面,详情请参见连接HoloWeb并执行查询。

  2. 在HoloWeb页面顶部菜单栏,单击元数据管理。

  3. 在元数据管理页面左侧的已登录实例列表,鼠标右击要复制的表,选择复制表结构。

  4. 在复制表结构页签,配置如下参数。

    类别

    参数

    说明

    目标位置

    表名

    目标表的表名称,可自定义命名。默认为:源表_copy。

    描述

    对目标表的描述,可选择是否配置。

    模式

    目标表所在的SCHEMA,默认为:public。

    高级选项

    是否同步源表属性

    选择目标表是否同步源表的属性。

    说明

    仅Hologres V0.10及以上版本实例支持同步源表属性,如果您的实例低于V0.10版本,请选择否或升级实例。

  5. 单击右上角提交,完成表复制。

属性继承一览表

Hologres从V2.0版本开始,使用CREATE TABLE LIKE复制表时,各表属性的继承情况如下。

属性名

是否继承

说明

binlog.level

是

是否开启Binlog。

binlog.ttl

是

Binlog的存活时间(单位:秒),超过存活时间的Binlog数据会被异步删除。

clustering_key

是

存储时数据基于哪些列排序。

distribution_key

是

数据分布基于哪些列,用于打散数据以并行查询。

encryption_options

是

单表加密属性。

online_config_*

是

无需重启即可生效的表属性,用于优化数据存储或加速查询。

orientation

是

存储格式,行存或列存。

primary_key

是

主键。

proxima_vectors

是

向量索引。

serial列

是

不会创建新的sequence对象,而是使用源表的sequence。

segment_key(event_time_column)

是

基于哪些列过滤存储文件。

storage_format

是

存储文件格式,sst或orc。

table_group

是

表所在的Table Group。

table_storage_mode

是

冷热存储模式。

time_to_live_in_seconds

是

表数据的存活时间(单位:秒),超过存活时间的数据会被异步删除。

mutate_type

否

创建单表物化视图的表必须将mutate_type设置为appendonly。

shared_readonly

否

是否将表设置为只读。

readonly

否

是否禁止修改表结构和表数据。

matview

否

单表物化视图不会被继承。