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版本,請選擇否或升級執行個體。
單擊右上方提交,完成表複製。