Cette rubrique explique comment Hologres gère les valeurs par défaut lors de l'écriture de données dans différents scénarios : SQL, Flink et Data Integration de DataWorks.
Règle de base : si aucune valeur par défaut n'est configurée pour un champ et qu'aucune valeur n'est fournie lors d'une opération d'écriture, le système insère NULL. Les tableaux et sections ci-dessous décrivent les variations de cette règle selon la méthode d'écriture et les paramètres utilisés.
Récapitulatif du comportement
Le tableau suivant résume le comportement des valeurs par défaut pour toutes les méthodes d'écriture. Consultez-le pour identifier rapidement le comportement attendu avant d'entrer dans les détails.
| Méthode d'écriture | Type de champ | Valeur par défaut configurée ? | Comportement |
|---|---|---|---|
| SQL | Nullable | Oui | Insère la valeur par défaut (si le champ est omis) |
| SQL | Nullable | Non | Insère NULL |
| SQL | Non null | Oui | Insère la valeur par défaut (si le champ est omis) |
| Flink — mode JDBC | Nullable | Non | Insère NULL |
| Flink — mode JDBC | Nullable | Oui | Insère la valeur par défaut si mutatetype=InsertOrUpdate ; sinon, insère NULL |
| Flink — mode JDBC | Non null | Non | Signale une erreur si EnableDefaultForNotNullColumn=false ; insère une valeur par défaut basée sur le type de données si true |
| Flink — mode JDBC | Non null | Oui | Insère la valeur par défaut (calculée par le moteur Hologres) ; dans les versions antérieures à la V2.0, cela peut empêcher l'utilisation des plans fixes |
| Flink — mode Fixed copy | Nullable | Non | Insère NULL |
| Flink — mode Fixed copy | Nullable | Oui | Insère la valeur par défaut |
| Flink — mode Fixed copy | Non null | Non | Signale une erreur |
| Flink — mode Fixed copy | Non null | Oui | Insère la valeur par défaut |
| Flink — mode BulkLoad (HQEcopy) | Nullable | Non | Insère NULL |
| Flink — mode BulkLoad (HQEcopy) | Nullable | Oui | Insère la valeur par défaut |
| Flink — mode BulkLoad (HQEcopy) | Non null | Non | Signale une erreur |
| Flink — mode BulkLoad (HQEcopy) | Non null | Oui | Insère la valeur par défaut |
| DataWorks — lot DataX | Nullable | Non | Insère NULL |
| DataWorks — lot DataX | Nullable | Oui, conflictMode=Replace |
Insère NULL |
| DataWorks — lot DataX | Nullable | Oui, conflictMode=Update |
Insère la valeur par défaut |
| DataWorks — lot DataX | Non null | Non, default.enable=true (par défaut) |
Insère une valeur par défaut basée sur le type de données (par exemple, "" ou 0) |
| DataWorks — lot DataX | Non null | Non, default.enable=false |
Signale une erreur |
| DataWorks — lot DataX | Non null | Oui, default.enable=true (par défaut) |
Insère la valeur par défaut |
| DataWorks — lot DataX | Non null | Oui, default.enable=false |
Insère la valeur par défaut ; dans les versions antérieures à la V2.0, les plans fixes peuvent échouer |
| DataWorks — temps réel StreamX | Nullable | Non | Insère NULL |
| DataWorks — temps réel StreamX | Nullable | Oui, conflictMode=Replace ou Ignore |
Insère NULL |
| DataWorks — temps réel StreamX | Nullable | Oui, conflictMode=Update |
Insère la valeur par défaut |
| DataWorks — temps réel StreamX | Non null | Non, default.enable=true (par défaut) |
Insère une valeur par défaut basée sur le type de données (par exemple, "" ou 0) |
| DataWorks — temps réel StreamX | Non null | Non, default.enable=false |
Signale une erreur |
| DataWorks — temps réel StreamX | Non null | Oui, default.enable=true (par défaut) |
Insère la valeur par défaut |
| DataWorks — temps réel StreamX | Non null | Oui, default.enable=false |
Insère la valeur par défaut ; dans les versions antérieures à la V2.0, les plans fixes peuvent échouer |
Scénarios SQL
Si une valeur par défaut est configurée pour un champ et qu'aucune valeur n'est spécifiée lors d'une opération d'écriture ou de mise à jour, Hologres remplit automatiquement ce champ avec la valeur par défaut.
Les exemples suivants utilisent cette table :
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;
Exemple 1 : Spécifiez des valeurs pour les deux colonnes. Les valeurs spécifiées écrasent les valeurs par défaut.
-- Specify values for column a and column b.
INSERT INTO default_test VALUES (1, NULL);
-- Query the table.
SELECT * FROM default_test;
Résultat :
a b
1 \N
Exemple 2 : Omettez la colonne b. Le système insère la valeur par défaut pour la colonne b.
-- Omit column b.
INSERT INTO default_test (a) VALUES (2);
-- Query the table.
SELECT * FROM default_test;
Résultat :
a b
1 \N
2 2023-11-17 10:11:33.276+08
Exemple 3 : Exécutez INSERT ON CONFLICT DO NOTHING sans spécifier la colonne a (la clé primaire). Le système écrit la valeur de la colonne b et insère la valeur par défaut pour la colonne a.
-- 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;
Résultat :
a b
2 2023-11-17 10:11:33.276+08
2023 2023-11-18 10:11:33.276+08
1 \N
Exemple 4 : Exécutez INSERT ON CONFLICT DO UPDATE avec des valeurs explicites pour les deux colonnes. Les valeurs spécifiées écrasent les valeurs par défaut.
-- 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;
Résultat :
a b
1 \N
2023 2023-11-18 10:11:33.276+08
2 \N
Exemple 5 : Exécutez INSERT ON CONFLICT DO UPDATE en mettant à jour uniquement la colonne b. La colonne a n'est pas mise à jour.
-- 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;
Résultat :
a b
2 \N
1 \N
2023 \N
Écriture de données avec Flink
Pour plus d'informations sur les modes d'écriture Flink, consultez la rubrique Hologres.
Mode JDBC
Les règles suivantes s'appliquent aux champs pour lesquels aucune valeur n'est spécifiée.
Champs nullable
Aucune valeur par défaut configurée : le système insère NULL.
Valeur par défaut configurée : le système insère la valeur par défaut si
mutatetypeest défini surInsertOrUpdate; sinon, il insère NULL.
Champs non null
-
Aucune valeur par défaut configurée :
EnableDefaultForNotNullColumn=false: le système signale une erreur.EnableDefaultForNotNullColumn=true: Holo Client insère une valeur par défaut basée sur le type de données (par exemple, une chaîne vide"").
-
Valeur par défaut configurée :
EnableDefaultForNotNullColumn=false: le moteur Hologres calcule et écrit la valeur par défaut. Dans les versions de Hologres antérieures à la V2.0, cela peut empêcher l'utilisation des plans fixes et entraîner des problèmes de performances.EnableDefaultForNotNullColumn=true: Holo Client insère une valeur par défaut basée sur le type de données.
Vous pouvez mettre à niveau manuellement votre instance Hologres ou rejoindre le groupe DingTalk Hologres pour demander une mise à niveau. Pour plus d'informations, consultez la section « Manual upgrade » de la rubrique Upgrade an instance . Pour obtenir une assistance en ligne, consultez la rubrique Obtain online support for Hologres .
Mode Fixed copy
Seules les opérations UPDATE et IGNORE sont prises en charge dans ce mode. Lorsque vous mettez à jour des champs spécifiques, seuls ces champs sont modifiés ; tous les autres champs restent inchangés. Pour obtenir un effet REPLACE, déclarez tous les champs dans l'instruction DDL Flink.
Les règles suivantes s'appliquent aux champs pour lesquels aucune valeur n'est spécifiée.
Champs nullable
Aucune valeur par défaut configurée : le système insère NULL.
Valeur par défaut configurée : le système insère la valeur par défaut.
Champs non null
Aucune valeur par défaut configurée : le système signale une erreur.
Valeur par défaut configurée : le système insère la valeur par défaut.
Mode BulkLoad (HQEcopy)
Les opérations UPDATE ne sont pas prises en charge dans ce mode. Les règles suivantes s'appliquent aux champs pour lesquels aucune valeur n'est spécifiée.
Champs nullable
Aucune valeur par défaut configurée : le système insère NULL.
Valeur par défaut configurée : le système insère la valeur par défaut.
Champs non null
Aucune valeur par défaut configurée : le système signale une erreur.
Valeur par défaut configurée : le système insère la valeur par défaut.
Écriture de données avec Data Integration de DataWorks
Synchronisation par lots basée sur DataX
DataX de Data Integration prend en charge la synchronisation par lots à partir d'une table ou d'une base de données. Pour plus d'informations, consultez la rubrique Hologres data source. Le mode JDBC est utilisé automatiquement. Les règles suivantes s'appliquent aux champs pour lesquels aucune valeur n'est spécifiée.
Champs nullable
Aucune valeur par défaut configurée : le système insère NULL.
-
Valeur par défaut configurée :
conflictMode=Replace: le système insère NULL.conflictMode=Update: le système insère la valeur par défaut.
Champs non null
-
Aucune valeur par défaut configurée :
default.enable=true(par défaut) : Holo Client insère une valeur par défaut basée sur le type de données (par exemple, une chaîne vide""ou0).default.enable=false: le système signale une erreur.
-
Valeur par défaut configurée :
default.enable=true(par défaut) : le système insère la valeur par défaut.default.enable=false: le système insère également la valeur par défaut. Dans les versions de Hologres antérieures à la V2.0, les plans fixes peuvent ne pas être utilisés, ce qui peut entraîner des problèmes de performances.
Synchronisation en temps réel basée sur StreamX
StreamX de Data Integration prend en charge la synchronisation en temps réel à partir d'une table. Pour plus d'informations, consultez la rubrique Hologres data source. Le mode JDBC est utilisé automatiquement. Les règles suivantes s'appliquent aux champs pour lesquels aucune valeur n'est spécifiée.
Champs nullable
Aucune valeur par défaut configurée : le système insère NULL.
-
Valeur par défaut configurée :
conflictMode=ReplaceouconflictMode=Ignore: le système insère NULL.conflictMode=Update: le système insère la valeur par défaut.
Champs non null
-
Aucune valeur par défaut configurée :
default.enable=true(par défaut) : Holo Client insère une valeur par défaut basée sur le type de données (par exemple, une chaîne vide""ou0).default.enable=false: le système signale une erreur.
-
Valeur par défaut configurée :
default.enable=true(par défaut) : le système insère la valeur par défaut.default.enable=false: le système insère également la valeur par défaut. Dans les versions de Hologres antérieures à la V2.0, les plans fixes peuvent ne pas être utilisés, ce qui peut entraîner des problèmes de performances.
Vous pouvez mettre à niveau manuellement votre instance Hologres ou rejoindre le groupe DingTalk Hologres pour demander une mise à niveau. Pour plus d'informations, consultez la section « Manual upgrade » de la rubrique Upgrade an instance . Pour obtenir une assistance en ligne, consultez la rubrique Obtain online support for Hologres .
Mapping des valeurs par défaut de Holo Client
Lorsque vous utilisez Flink ou Data Integration de DataWorks pour écrire des données en mode JDBC, Holo Client gère la couche d'écriture. Si vous spécifiez des valeurs pour des champs spécifiques lors de l'écriture des données, le paramètre default.enable est automatiquement défini sur true (équivalent à enableDefaultForNotNullColumn=true). Si un champ n'a ni valeur ni valeur par défaut configurée, Holo Client insère automatiquement une valeur par défaut basée sur le type de données. Le tableau suivant répertorie ces valeurs par défaut.
| Type | Valeur par défaut insérée par Holo Client |
|---|---|
| SMALLINT | 0 |
| INTEGER | 0 |
| BIGINT | 0 |
| REAL | 0,0 |
| DOUBLE PRECISION | 0,0 |
| DECIMAL | 0 |
| BOOLEAN | false |
| VARCHAR(n) | "" (chaîne vide) |
| CHAR(n) | "" (chaîne vide) |
| TEXT | "" (chaîne vide) |
| 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 et JSONB | Impossible d'écrire une valeur par défaut |
| BYTEA | Impossible d'écrire une valeur par défaut |
| RoaringBitmap | Impossible d'écrire une valeur par défaut |
| BIT(n) | Impossible d'écrire une valeur par défaut |
| VARBIT(n) | Impossible d'écrire une valeur par défaut |
| INTERVAL | Impossible d'écrire une valeur par défaut |