本文為您介紹在多個情境下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 |