本文为您介绍在多个场景下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。例如:空字符串
("")
。
已设置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。
通过数据集成写入Hologres场景
DataX离线同步
数据集成的DataX离线同步场景包括:离线单表同步、离线整库同步等,详情请参见Hologres数据源。目前数据集成默认使用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。例如:空字符串
("")
或0。default.enable为false,系统将会抛出异常。
已设置Default Value
default.enable为true(默认值),写入Default Value。
default.enable为false,写入Default Value。但在Hologres V2.0以下版本中,可能无法进入Fixed plan,从而导致性能问题。
StreamX实时同步
数据集成的StreamX实时同步场景包括:实时单表同步等,详情请参见Hologres数据源。目前数据集成默认使用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。例如:空字符串
("")
或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以及DataWorks数据集成采用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 |