全部產品
Search
文件中心

Hologres:Default值

更新時間:Jun 30, 2024

本文為您介紹在多個情境下Default值的應用以及Holo-Client的Default值對應表資訊。

SQL情境

在SQL情境中,如果欄位已設定Default值,在執行寫入或更新操作時,若未明確指定該欄位的值,系統會自動填滿Default值。樣本如下。

建立default_test表,並分別為a列和b列設定Default值。

BEGIN;
CREATE TABLE default_test (
    a int NOT NULL DEFAULT 2023,
    b timestamptz DEFAULT '2023-11-17 10:11:33.276+08',
    PRIMARY KEY (a)
);
COMMIT;
  • 樣本1:為a列和b列指定具體值,該指定值將會覆蓋Default值。

    --為帶有Default列(a列和b列)指定具體值
    INSERT INTO default_test VALUES (1, NULL);
    --查詢結果
    SELECT * FROM default_test;

    返回結果如下。

    a	b
    1	\N
  • 樣本2:未指定b列的具體值,b列將會自動填滿Default值。

    --未指定b列的具體值
    INSERT INTO default_test (a) VALUES (2);
    --查詢結果
    SELECT * FROM default_test;

    返回結果如下。

    a	 b
    1	 \N
    2	 2023-11-17 10:11:33.276+08
  • 樣本3:使用INSERT ON DO NOTHING語句,未指定a列(PK列)的值,系統會將待寫入的b列資料視為新增資料寫入,並自動為a列填充Default值。

    --INSERT ON DO NOTHING,未指定a列(PK列)的值,系統會將其視作新增資料並自動填滿a列的Default值。
    INSERT INTO default_test (b) VALUES ('2023-11-18 10:11:33.276+08') ON CONFLICT (a) DO NOTHING;
    --查詢結果
    SELECT * FROM default_test;

    返回結果如下。

    a	b
    2	2023-11-17 10:11:33.276+08
    2023	2023-11-18 10:11:33.276+08
    1	\N
  • 樣本4:使用INSERT ON CONFLICT DO UPDATE語句,將a、b更新為指定值,覆蓋Default值。

    --使用insert on do update,將a、b更新為指定值,覆蓋Default值。
    INSERT INTO default_test (a, b)VALUES (2,null ) ON CONFLICT (a) DO UPDATE SET (a,b) = ROW(EXCLUDED.*);
    --查詢結果
    SELECT * FROM default_test;

    返回結果如下。

    a	b
    1	\N
    2023	2023-11-18 10:11:33.276+08
    2	\N
  • 樣本5:使用INSERT ON CONFLICT DO UPDATE語句,僅將b列更新為指定值,覆蓋Default值,a列不做更新。

    --使用INSERT ON CONFLICT DO UPDATE,僅將b列更新為指定值,覆蓋Default值,a列不做更新。
    INSERT INTO default_test (a, b) VALUES (2023,null)ON CONFLICT (a) DO UPDATE SET b = EXCLUDED.b;
    --查詢結果
    SELECT * FROM default_test;

    返回結果如下。

    a	b
    2	\N
    1	\N
    2023	\N

Flink寫入Hologres情境

JDBC模式

Flink資料寫入過程中,其中未寫入的列表現如下:

  • Nullable欄位:

    • 未設定Default Value,若未指定具體值,寫入Null。

    • 已設定Default Value,僅在mutatetype參數設定為InsertOrUpdate時Default Value才會生效,否則寫入Null。

  • Not Null欄位:

    • 未設定Default Value:

      • EnableDefaultForNotNullColumn參數設定為false,若未指定具體值,系統將不會寫入Default Value並拋出異常。

      • EnableDefaultForNotNullColumn參數設定為true,Holo-Client將會根據列的資料類型寫入Default Value。例如:Null 字元串("")

    • 已設定Default Value:

      • EnableDefaultForNotNullColumn參數設定為false,Hologres引擎會計算寫入Default Value。但在Hologres V2.0以下版本中,可能無法進入Fixed plan,從而導致效能問題。

        說明

        若您需要進行執行個體升級,您可以使用執行個體升級或加入即時數倉Hologres交流群申請升級執行個體,詳情請參見如何擷取更多的線上支援?

      • EnableDefaultForNotNullColumn參數設定為true,Holo-Client將會根據列的資料類型寫入Default Value。

fixed copy模式

該模式只支援UPDATE和IGNORE操作,因此,如果你選擇了更新部分列,那麼只有這些被選定的列值會被修改,其餘列保持不變。如果想實作類別型REPLACE的功能,必須在Flink DDL中聲明所有列。其中未寫入的列表現如下:

  • Nullable欄位:

    • 未設定Default Value,寫入Null。

    • 已設定Default Value,寫入Default value。

  • Not Null欄位:

    • 未設定Default Value,系統將會拋出異常。

    • 已設定Default Value,寫入Default Value。

bulkload模式(HQEcopy)

該模式不支援UPDATE操作,在寫入Hologres時唯寫入選中列的值,其中未寫入的列表現如下:

  • Nullable欄位:

    • 未設定Default Value,寫入Null。

    • 已設定Default Value,寫入Default Value。

  • Not Null欄位

    • 未設定Default Value,系統將會拋出異常。

    • 已設定Default Value,寫入Default Value。

說明

Flink寫入Hologres不同模式,詳情請參見即時數倉Hologres

通過Data Integration寫入Hologres情境

DataX離線同步

Data Integration的DataX離線同步情境包括:離線單表同步、離線整庫同步等,詳情請參見Hologres資料來源。目前Data Integration預設使用JDBC實現,在寫入部分列時,其中未寫入的列表現如下:

  • Nullable欄位

    • 未設定Default Value,寫入Null。

    • 已設定Default Value

      • conflictMode為Replace(整行更新)模式時,寫入Null。

      • conflictMode為Update(更新)模式時,寫入Default Value。

  • Not Null欄位

    • 未設定Default Value

      • default.enable為true(預設值),Holo-Client將會根據列的資料類型寫入Default Value。例如:Null 字元串("")或0。

      • default.enable為false,系統將會拋出異常。

    • 已設定Default Value

      • default.enable為true(預設值),寫入Default Value。

      • default.enable為false,寫入Default Value。但在Hologres V2.0以下版本中,可能無法進入Fixed plan,從而導致效能問題。

StreamX即時同步

Data Integration的StreamX即時同步情境包括:即時單表同步等,詳情請參見Hologres資料來源。目前Data Integration預設使用JDBC實現,在寫入部分列時,其中未寫入的列表現如下:

  • Nullable欄位

    • 未設定Default Value,寫入Null。

    • 已設定Default Value

      • conflictMode為Replace(整行更新)或Ignore(忽略)模式時,寫入Null。

      • conflictMode為Update(更新)模式時,寫入Default Value。

  • Not Null欄位

    • 未設定Default Value

      • default.enable為true(預設值),Holo-Client將會根據列的資料類型寫入Default Value。例如:Null 字元串("")或0。

      • default.enable為false,系統將會拋出異常。

    • 已設定Default Value

      • default.enable為true(預設值),寫入Default Value。

      • default.enable為false,寫入Default Value。但在Hologres V2.0以下版本中,可能無法進入Fixed plan,從而導致效能問題。

        說明

        若您需要進行執行個體升級,您可以使用執行個體升級或加入即時數倉Hologres交流群申請升級執行個體,詳情請參見如何擷取更多的線上支援?

Holo-Client Default Value映射表

Flink以及DataWorksData Integration採用Hologres Connector通過JDBC模式進行互動,統一使用Holo-Client實現。在執行部分列寫入操作時,預設會配置default.enable為true(enableDefaultForNotNullColumn)屬性。對於沒有顯示寫入的列,並未設定Default Value,那麼Holo-Client會根據列的不同類型寫入相應的Default Value。Default Value映射表如下所示。

類型

Holo-Client自動化填充Default Value

SMALLINT

0

INTEGER

BIGINT

REAL

0.0

DOUBLE PRECISION

DECIMAL

0

BOOLEAN

false

VARCHAR(n)

""

CHAR(n)

TEXT

TIMESTAMPTZ

1970-01-01 08:00:00

TIMESTAMP

DATE

1970-01-01

TIMETZ

08:00:00

TIME

JSON和JSONB

不支援寫入Default Value

BYTEA

RoaringBitmap

BIT(n)

VARBIT(n)

INTERVAL