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和動態分區屬性。
普通表
命令格式
在Hologres中,普通表
CREATE TABLE LIKE
的命令格式如下:--復制一張普通表,但不能復制表屬性 CALL hg_create_table_like('new_table_name', 'select_query'); --復制一張表并復制表屬性 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'])
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$$);
分區表
命令格式
在Hologres中,分區表的
CREATE TABLE LIKE
的命令格式如下:--復制一張分區表,但不能復制表屬性 CALL hg_create_table_like('new_table_name', 'select_query', 'partition_clause');
參數說明
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:分區相關的語法定義。用于指定分區鍵,不會自動創建分區子表,需要手動建分區子表。
使用示例
如在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
創建一張分區表示例如下:創建一個分區表
--新增一個字段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為分區值
HoloWeb可視化復制表
HoloWeb提供可視化復制表功能,無需寫SQL命令就能復制表,步驟如下。
進入HoloWeb頁面,詳情請參見連接HoloWeb并執行查詢。
在HoloWeb頁面頂部菜單欄,單擊元數據管理。
在元數據管理頁面左側的已登錄實例列表,鼠標右擊要復制的表,選擇復制表結構。
在復制表結構頁簽,配置如下參數。
類別
參數
說明
目標位置
表名
目標表的表名稱,可自定義命名。默認為:源表_copy。
描述
對目標表的描述,可選擇是否配置。
模式
目標表所在的SCHEMA,默認為:public。
高級選項
是否同步源表屬性
選擇目標表是否同步源表的屬性。
說明僅Hologres V0.10及以上版本實例支持同步源表屬性,如果您的實例低于V0.10版本,請選擇否或升級實例。
單擊右上角提交,完成表復制。