全部產品
Search
文件中心

Hologres:CREATE TABLE LIKE

更新時間:Jul 08, 2024

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和動態分區屬性。

普通表

  1. 命令格式

    在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的表,但不會插入任何資料。

  2. 參數說明

    • 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:需要複製的原表名。

  3. 使用樣本

    如在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$$);

分區表

  1. 命令格式

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

    --複製一張分區表,但不能複製表屬性
    CALL hg_create_table_like('new_table_name', 'select_query', 'partition_clause');
  2. 參數說明

    • 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:分區相關的文法定義。用於指定分區鍵,不會自動建立分區子表,需要手動建分區子表。

  3. 使用樣本

    如在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命令就能複製表,步驟如下。

  1. 進入HoloWeb頁面,詳情請參見串連HoloWeb

  2. HoloWeb頁面頂部功能表列,單擊中繼資料管理

  3. 中繼資料管理頁面左側的已登入執行個體列表,滑鼠右擊要複製的表,選擇複製表結構

  4. 複製表結構頁簽,配置如下參數。複製表結構

    類別

    參數

    說明

    目標位置

    表名

    目標表的表名稱,可自訂命名。預設為:源表_copy。

    描述

    對目標表的描述,可選擇是否配置。

    模式

    目標表所在的SCHEMA,預設為:public。

    進階選項

    是否同步源表屬性

    選擇目標表是否同步源表的屬性。

    說明

    僅Hologres V0.10及以上版本執行個體支援同步源表屬性,如果您的執行個體低於V0.10版本,請選擇或升級執行個體。

  5. 單擊右上方提交,完成表複製。