Default值

本文为您介绍在多个场景下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