Default值
本文為您介紹在多個場景下Default值的應(yīng)用以及Holo-Client的Default值映射表信息。
SQL場景
在SQL場景中,如果字段已設(shè)置Default值,在執(zhí)行寫入或更新操作時,若未明確指定該字段的值,系統(tǒng)會自動填充Default值。示例如下。
創(chuàng)建default_test
表,并分別為a列和b列設(shè)置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); --查詢結(jié)果 SELECT * FROM default_test;
返回結(jié)果如下。
a b 1 \N
示例2:未指定b列的具體值,b列將會自動填充Default值。
--未指定b列的具體值 INSERT INTO default_test (a) VALUES (2); --查詢結(jié)果 SELECT * FROM default_test;
返回結(jié)果如下。
a b 1 \N 2 2023-11-17 10:11:33.276+08
示例3:使用
INSERT ON DO NOTHING
語句,未指定a列(PK列)的值,系統(tǒng)會將待寫入的b列數(shù)據(jù)視為新增數(shù)據(jù)寫入,并自動為a列填充Default值。--INSERT ON DO NOTHING,未指定a列(PK列)的值,系統(tǒng)會將其視作新增數(shù)據(jù)并自動填充a列的Default值。 INSERT INTO default_test (b) VALUES ('2023-11-18 10:11:33.276+08') ON CONFLICT (a) DO NOTHING; --查詢結(jié)果 SELECT * FROM default_test;
返回結(jié)果如下。
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.*); --查詢結(jié)果 SELECT * FROM default_test;
返回結(jié)果如下。
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; --查詢結(jié)果 SELECT * FROM default_test;
返回結(jié)果如下。
a b 2 \N 1 \N 2023 \N
Flink寫入Hologres場景
JDBC模式
Flink數(shù)據(jù)寫入過程中,其中未寫入的列表現(xiàn)如下:
Nullable字段:
未設(shè)置Default Value,若未指定具體值,寫入Null。
已設(shè)置Default Value,僅在mutatetype參數(shù)設(shè)置為InsertOrUpdate時Default Value才會生效,否則寫入Null。
Not Null字段:
未設(shè)置Default Value:
EnableDefaultForNotNullColumn參數(shù)設(shè)置為false,若未指定具體值,系統(tǒng)將不會寫入Default Value并拋出異常。
EnableDefaultForNotNullColumn參數(shù)設(shè)置為true,Holo-Client將會根據(jù)列的數(shù)據(jù)類型寫入Default Value。例如:空字符串
("")
。
已設(shè)置Default Value:
EnableDefaultForNotNullColumn參數(shù)設(shè)置為false,Hologres引擎會計算寫入Default Value。但在Hologres V2.0以下版本中,可能無法進入Fixed plan,從而導(dǎo)致性能問題。
說明若您需要進行實例升級,您可以使用實例升級或加入實時數(shù)倉Hologres交流群申請升級實例,詳情請參見如何獲取更多的在線支持?
EnableDefaultForNotNullColumn參數(shù)設(shè)置為true,Holo-Client將會根據(jù)列的數(shù)據(jù)類型寫入Default Value。
fixed copy模式
該模式只支持UPDATE和IGNORE操作,因此,如果你選擇了更新部分列,那么只有這些被選定的列值會被修改,其余列保持不變。如果想實現(xiàn)類型REPLACE的功能,必須在Flink DDL中聲明所有列。其中未寫入的列表現(xiàn)如下:
Nullable字段:
未設(shè)置Default Value,寫入Null。
已設(shè)置Default Value,寫入Default value。
Not Null字段:
未設(shè)置Default Value,系統(tǒng)將會拋出異常。
已設(shè)置Default Value,寫入Default Value。
bulkload模式(HQEcopy)
該模式不支持UPDATE操作,在寫入Hologres時只寫入選中列的值,其中未寫入的列表現(xiàn)如下:
Nullable字段:
未設(shè)置Default Value,寫入Null。
已設(shè)置Default Value,寫入Default Value。
Not Null字段
未設(shè)置Default Value,系統(tǒng)將會拋出異常。
已設(shè)置Default Value,寫入Default Value。
Flink寫入Hologres不同模式,詳情請參見實時數(shù)倉Hologres。
通過數(shù)據(jù)集成寫入Hologres場景
DataX離線同步
數(shù)據(jù)集成的DataX離線同步場景包括:離線單表同步、離線整庫同步等,詳情請參見Hologres數(shù)據(jù)源。目前數(shù)據(jù)集成默認(rèn)使用JDBC實現(xiàn),在寫入部分列時,其中未寫入的列表現(xiàn)如下:
Nullable字段
未設(shè)置Default Value,寫入Null。
已設(shè)置Default Value
conflictMode為Replace(整行更新)模式時,寫入Null。
conflictMode為Update(更新)模式時,寫入Default Value。
Not Null字段
未設(shè)置Default Value
default.enable為true(默認(rèn)值),Holo-Client將會根據(jù)列的數(shù)據(jù)類型寫入Default Value。例如:空字符串
("")
或0。default.enable為false,系統(tǒng)將會拋出異常。
已設(shè)置Default Value
default.enable為true(默認(rèn)值),寫入Default Value。
default.enable為false,寫入Default Value。但在Hologres V2.0以下版本中,可能無法進入Fixed plan,從而導(dǎo)致性能問題。
StreamX實時同步
數(shù)據(jù)集成的StreamX實時同步場景包括:實時單表同步等,詳情請參見Hologres數(shù)據(jù)源。目前數(shù)據(jù)集成默認(rèn)使用JDBC實現(xiàn),在寫入部分列時,其中未寫入的列表現(xiàn)如下:
Nullable字段
未設(shè)置Default Value,寫入Null。
已設(shè)置Default Value
conflictMode為Replace(整行更新)或Ignore(忽略)模式時,寫入Null。
conflictMode為Update(更新)模式時,寫入Default Value。
Not Null字段
未設(shè)置Default Value
default.enable為true(默認(rèn)值),Holo-Client將會根據(jù)列的數(shù)據(jù)類型寫入Default Value。例如:空字符串
("")
或0。default.enable為false,系統(tǒng)將會拋出異常。
已設(shè)置Default Value
default.enable為true(默認(rèn)值),寫入Default Value。
default.enable為false,寫入Default Value。但在Hologres V2.0以下版本中,可能無法進入Fixed plan,從而導(dǎo)致性能問題。
說明若您需要進行實例升級,您可以使用實例升級或加入實時數(shù)倉Hologres交流群申請升級實例,詳情請參見如何獲取更多的在線支持?
Holo-Client Default Value映射表
Flink以及DataWorks數(shù)據(jù)集成采用Hologres Connector通過JDBC模式進行交互,統(tǒng)一使用Holo-Client實現(xiàn)。在執(zhí)行部分列寫入操作時,默認(rèn)會配置default.enable為true(enableDefaultForNotNullColumn)屬性。對于沒有顯示寫入的列,并未設(shè)置Default Value,那么Holo-Client會根據(jù)列的不同類型寫入相應(yīng)的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 |