Este documento descreve como o Hologres trata valores padrão ao gravar dados em diferentes cenários: SQL, Flink e Integração de Dados do DataWorks.
Regra base: Se nenhum valor padrão estiver configurado para um campo e nenhum valor for fornecido durante uma operação de gravação, o sistema preenche com NULL. As tabelas e seções abaixo detalham como essa regra varia conforme o caminho de gravação e os parâmetros utilizados.
Resumo do comportamento
A tabela a seguir resume o comportamento de valores padrão em todos os caminhos de gravação. Consulte-a para identificar rapidamente o comportamento esperado antes de analisar os detalhes.
|
Caminho de gravação |
Tipo de campo |
Valor padrão configurado? |
Comportamento |
|
SQL |
Aceita nulo |
Sim |
Preenche o valor padrão (se o campo for omitido) |
|
SQL |
Aceita nulo |
Não |
Preenche NULL |
|
SQL |
Não nulo |
Sim |
Preenche o valor padrão (se o campo for omitido) |
|
Flink — Modo JDBC |
Aceita nulo |
Não |
Preenche NULL |
|
Flink — Modo JDBC |
Aceita nulo |
Sim |
Preenche o valor padrão se |
|
Flink — Modo JDBC |
Não nulo |
Não |
Retorna erro se |
|
Flink — Modo JDBC |
Não nulo |
Sim |
Preenche o valor padrão (calculado pelo mecanismo do Hologres); em versões anteriores à V2.0, isso pode impedir o uso de fixed plans |
|
Flink — Modo Fixed copy |
Aceita nulo |
Não |
Preenche NULL |
|
Flink — Modo Fixed copy |
Aceita nulo |
Sim |
Preenche o valor padrão |
|
Flink — Modo Fixed copy |
Não nulo |
Não |
Retorna erro |
|
Flink — Modo Fixed copy |
Não nulo |
Sim |
Preenche o valor padrão |
|
Flink — Modo BulkLoad (HQEcopy) |
Aceita nulo |
Não |
Preenche NULL |
|
Flink — Modo BulkLoad (HQEcopy) |
Aceita nulo |
Sim |
Preenche o valor padrão |
|
Flink — Modo BulkLoad (HQEcopy) |
Não nulo |
Não |
Retorna erro |
|
Flink — Modo BulkLoad (HQEcopy) |
Não nulo |
Sim |
Preenche o valor padrão |
|
DataWorks — Lote via DataX |
Aceita nulo |
Não |
Preenche NULL |
|
DataWorks — Lote via DataX |
Aceita nulo |
Sim, |
Preenche NULL |
|
DataWorks — Lote via DataX |
Aceita nulo |
Sim, |
Preenche o valor padrão |
|
DataWorks — Lote via DataX |
Não nulo |
Não, |
Preenche um padrão baseado no tipo de dado (ex.: |
|
DataWorks — Lote via DataX |
Não nulo |
Não, |
Retorna erro |
|
DataWorks — Lote via DataX |
Não nulo |
Sim, |
Preenche o valor padrão |
|
DataWorks — Lote via DataX |
Não nulo |
Sim, |
Preenche o valor padrão; em versões anteriores à V2.0, fixed plans podem falhar |
|
DataWorks — Tempo real via StreamX |
Aceita nulo |
Não |
Preenche NULL |
|
DataWorks — Tempo real via StreamX |
Aceita nulo |
Sim, |
Preenche NULL |
|
DataWorks — Tempo real via StreamX |
Aceita nulo |
Sim, |
Preenche o valor padrão |
|
DataWorks — Tempo real via StreamX |
Não nulo |
Não, |
Preenche um padrão baseado no tipo de dado (ex.: |
|
DataWorks — Tempo real via StreamX |
Não nulo |
Não, |
Retorna erro |
|
DataWorks — Tempo real via StreamX |
Não nulo |
Sim, |
Preenche o valor padrão |
|
DataWorks — Tempo real via StreamX |
Não nulo |
Sim, |
Preenche o valor padrão; em versões anteriores à V2.0, fixed plans podem falhar |
Cenários SQL
Se um valor padrão estiver configurado para um campo e nenhum valor for especificado em uma operação de gravação ou atualização, o Hologres preenche automaticamente esse campo com o valor padrão.
Os exemplos a seguir utilizam esta tabela:
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;
Exemplo 1: Especifique valores para ambas as colunas. Os valores informados substituem os padrões.
-- Specify values for column a and column b.
INSERT INTO default_test VALUES (1, NULL);
-- Query the table.
SELECT * FROM default_test;
Resultado:
a b
1 \N
Exemplo 2: Omita a coluna b. O sistema preenche o valor padrão para a coluna b.
-- Omit column b.
INSERT INTO default_test (a) VALUES (2);
-- Query the table.
SELECT * FROM default_test;
Resultado:
a b
1 \N
2 2023-11-17 10:11:33.276+08
Exemplo 3: Execute INSERT ON CONFLICT DO NOTHING sem especificar a coluna a (chave primária). O sistema grava o valor da coluna b e preenche a coluna a com o valor padrão.
-- Column a is omitted; the system fills the default value (2023).
INSERT INTO default_test (b) VALUES ('2023-11-18 10:11:33.276+08') ON CONFLICT (a) DO NOTHING;
-- Query the table.
SELECT * FROM default_test;
Resultado:
a b
2 2023-11-17 10:11:33.276+08
2023 2023-11-18 10:11:33.276+08
1 \N
Exemplo 4: Execute INSERT ON CONFLICT DO UPDATE com valores explícitos para ambas as colunas. Os valores especificados substituem os padrões.
-- Specify values for both columns; specified values take precedence.
INSERT INTO default_test (a, b) VALUES (2, null) ON CONFLICT (a) DO UPDATE SET (a,b) = ROW(EXCLUDED.*);
-- Query the table.
SELECT * FROM default_test;
Resultado:
a b
1 \N
2023 2023-11-18 10:11:33.276+08
2 \N
Exemplo 5: Execute INSERT ON CONFLICT DO UPDATE atualizando apenas a coluna b. A coluna a não é modificada.
-- Only column b is updated; column a remains unchanged.
INSERT INTO default_test (a, b) VALUES (2023, null) ON CONFLICT (a) DO UPDATE SET b = EXCLUDED.b;
-- Query the table.
SELECT * FROM default_test;
Resultado:
a b
2 \N
1 \N
2023 \N
Gravar dados usando Flink
Para mais informações sobre os modos de gravação do Flink, consulte Hologres.
Modo JDBC
As regras a seguir aplicam-se a campos sem valores especificados.
Campos que aceitam nulo
Sem valor padrão configurado: o sistema preenche NULL.
Com valor padrão configurado: o sistema preenche o valor padrão se
mutatetypeestiver definido comoInsertOrUpdate; caso contrário, preenche NULL.
Campos não nulos
-
Sem valor padrão configurado:
EnableDefaultForNotNullColumn=false: o sistema retorna erro.EnableDefaultForNotNullColumn=true: o Holo Client preenche um padrão baseado no tipo de dado (por exemplo, uma string vazia"").
-
Com valor padrão configurado:
EnableDefaultForNotNullColumn=false: o mecanismo do Hologres calcula e grava o valor padrão. Em versões do Hologres anteriores à V2.0, isso pode impedir o uso de fixed plans e causar problemas de desempenho.EnableDefaultForNotNullColumn=true: o Holo Client preenche um padrão baseado no tipo de dado.
Atualize manualmente sua instância do Hologres ou entre no grupo DingTalk do Hologres para solicitar uma atualização. Para mais informações, consulte a seção "Atualização manual" em Atualizar uma instância . Para obter suporte online, consulte Obter suporte online para o Hologres .
Modo Fixed copy
Este modo suporta apenas operações UPDATE e IGNORE. Ao atualizar campos específicos, somente eles são modificados; todos os demais permanecem inalterados. Para obter o efeito REPLACE, declare todos os campos na instrução DDL do Flink.
As regras a seguir aplicam-se a campos sem valores especificados.
Campos que aceitam nulo
Sem valor padrão configurado: o sistema preenche NULL.
Com valor padrão configurado: o sistema preenche o valor padrão.
Campos não nulos
Sem valor padrão configurado: o sistema retorna erro.
Com valor padrão configurado: o sistema preenche o valor padrão.
Modo BulkLoad (HQEcopy)
Operações UPDATE não são suportadas neste modo. As regras a seguir aplicam-se a campos sem valores especificados.
Campos que aceitam nulo
Sem valor padrão configurado: o sistema preenche NULL.
Com valor padrão configurado: o sistema preenche o valor padrão.
Campos não nulos
Sem valor padrão configurado: o sistema retorna erro.
Com valor padrão configurado: o sistema preenche o valor padrão.
Gravar dados usando a Integração de Dados do DataWorks
Sincronização em lote baseada em DataX
O DataX da Integração de Dados suporta sincronização em lote a partir de uma tabela ou banco de dados. Para mais informações, consulte Fonte de dados Hologres. O modo JDBC é utilizado automaticamente. As regras a seguir aplicam-se a campos sem valores especificados.
Campos que aceitam nulo
Sem valor padrão configurado: o sistema preenche NULL.
-
Com valor padrão configurado:
conflictMode=Replace: o sistema preenche NULL.conflictMode=Update: o sistema preenche o valor padrão.
Campos não nulos
-
Sem valor padrão configurado:
default.enable=true(padrão): o Holo Client preenche um padrão baseado no tipo de dado (por exemplo, uma string vazia""ou0).default.enable=false: o sistema retorna erro.
-
Com valor padrão configurado:
default.enable=true(padrão): o sistema preenche o valor padrão.default.enable=false: o sistema também preenche o valor padrão. Em versões do Hologres anteriores à V2.0, fixed plans podem não ser utilizados, causando possíveis problemas de desempenho.
Sincronização em tempo real baseada em StreamX
O StreamX da Integração de Dados suporta sincronização em tempo real a partir de uma tabela. Para mais informações, consulte Fonte de dados Hologres. O modo JDBC é utilizado automaticamente. As regras a seguir aplicam-se a campos sem valores especificados.
Campos que aceitam nulo
Sem valor padrão configurado: o sistema preenche NULL.
-
Com valor padrão configurado:
conflictMode=ReplaceouconflictMode=Ignore: o sistema preenche NULL.conflictMode=Update: o sistema preenche o valor padrão.
Campos não nulos
-
Sem valor padrão configurado:
default.enable=true(padrão): o Holo Client preenche um padrão baseado no tipo de dado (por exemplo, uma string vazia""ou0).default.enable=false: o sistema retorna erro.
-
Com valor padrão configurado:
default.enable=true(padrão): o sistema preenche o valor padrão.default.enable=false: o sistema também preenche o valor padrão. Em versões do Hologres anteriores à V2.0, fixed plans podem não ser utilizados, causando possíveis problemas de desempenho.
Atualize manualmente sua instância do Hologres ou entre no grupo DingTalk do Hologres para solicitar uma atualização. Para mais informações, consulte a seção "Atualização manual" em Atualizar uma instância . Para obter suporte online, consulte Obter suporte online para o Hologres .
Mapeamento de valores padrão do Holo Client
Ao usar Flink ou a Integração de Dados do DataWorks para gravar dados no modo JDBC, o Holo Client gerencia a camada de gravação. Se você especificar valores para determinados campos durante a gravação, o parâmetro default.enable será automaticamente definido como true (equivalente a enableDefaultForNotNullColumn=true). Caso um campo não tenha valor nem padrão configurado, o Holo Client preenche automaticamente um padrão baseado no tipo de dado. A tabela a seguir lista esses valores padrão.
|
Tipo |
Padrão preenchido pelo Holo Client |
|
SMALLINT |
0 |
|
INTEGER |
0 |
|
BIGINT |
0 |
|
REAL |
0,0 |
|
DOUBLE PRECISION |
0,0 |
|
DECIMAL |
0 |
|
BOOLEAN |
false |
|
VARCHAR(n) |
|
|
CHAR(n) |
|
|
TEXT |
|
|
TIMESTAMPTZ |
1970-01-01 08:00:00 |
|
TIMESTAMP |
1970-01-01 08:00:00 |
|
DATE |
1970-01-01 |
|
TIMETZ |
08:00:00 |
|
TIME |
08:00:00 |
|
JSON e JSONB |
Não é possível gravar um valor padrão |
|
BYTEA |
Não é possível gravar um valor padrão |
|
RoaringBitmap |
Não é possível gravar um valor padrão |
|
BIT(n) |
Não é possível gravar um valor padrão |
|
VARBIT(n) |
Não é possível gravar um valor padrão |
|
INTERVAL |
Não é possível gravar um valor padrão |