Tous les produits
Search
Centre de documentation

Hologres:Primary key

Dernière mise à jour :Aug 11, 2026

Une clé primaire (PK) garantit l'unicité et l'intégrité des données pour chaque ligne d'une table. Dans Hologres, les clés primaires fonctionnent comme dans les bases de données traditionnelles : elles identifient de manière unique chaque enregistrement, ne peuvent pas être nulles et peuvent s'étendre sur plusieurs colonnes (clé composite). Cette rubrique décrit comment configurer les clés primaires des tables Hologres.

Fonctionnement des clés primaires

Hologres gère automatiquement un fichier d'index de clé primaire stocké au format orienté ligne, permettant des recherches clé-valeur (KV) ultra-rapides. L'index associe la clé primaire à un RID (identifiant de ligne) et à la clé de clustering. Le RID est généré automatiquement et augmente de façon monotone à chaque opération UPSERT. Cet index permet de détecter efficacement les conflits de clé primaire et de localiser rapidement le fichier de données. Lorsqu'une table possède une clé primaire, le système identifie le RID et la clé de clustering via l'index de clé primaire, puis utilise ces informations pour cibler le fichier de données approprié.

La définition d'une clé primaire dans Hologres active des fonctionnalités essentielles pour les scénarios d'entrepôt de données en temps réel :

  • Opérations UPSERT et DELETE hautes performances.

    Au-delà des écritures traditionnelles en ajout seul (append-only), Hologres prend en charge les mises à jour complètes de lignes et partielles de colonnes grâce aux clés primaires. Lors d'une mise à jour, le système localise uniquement la ligne cible par sa clé primaire au lieu d'analyser toute la table. Il atteint ainsi un débit élevé pour les opérations UPSERT tout en maintenant l'unicité des données.

  • Requêtes ponctuelles par clé primaire à haut QPS.

    Comme indiqué dans la section Configurer l'orientation des données, lorsqu'une table possède une clé primaire, les requêtes filtrant sur cette clé localisent rapidement la ligne complète, ce qui améliore considérablement les performances. Cela s'avère particulièrement efficace pour les tables orientées ligne, où la clé primaire sert par défaut à la fois de clé de clustering et de clé de distribution. Cette configuration permet des requêtes ponctuelles avec une latence de l'ordre de la milliseconde à très haut QPS, adaptées aux scénarios de contrôle des risques en temps réel, aux moteurs de recommandation et autres services en ligne.

Bonnes pratiques

Choisissez comme clés primaires des colonnes ayant une signification métier réelle. Évitez d'utiliser des colonnes de type SERIAL comme clés primaires, car le type SERIAL acquiert un verrou au niveau de la table lors des écritures, ce qui dégrade les performances. De plus, les valeurs SERIAL risquent de provoquer un dépassement de capacité à mesure que le volume de données augmente.

Limites

  • Les colonnes de clé primaire doivent être uniques et non nulles (NOT NULL). Vous ne pouvez définir la clé primaire que dans une seule instruction, laquelle peut inclure plusieurs colonnes.

  • Seule la syntaxe de contrainte PRIMARY KEY au niveau de la table est prise en charge : PRIMARY KEY (col1, col2, ...). La syntaxe inline (au niveau de la colonne) telle que col_name type PRIMARY KEY n'est pas prise en charge. Par exemple, id bigint PRIMARY KEY renvoie l'erreur the usage of PRIMARY KEY in the create table with ID columns is unsupported. Utilisez plutôt PRIMARY KEY (id).

  • Une clé primaire composite prend en charge un maximum de 32 colonnes.

  • Les types de données suivants ne peuvent pas servir de colonnes de clé primaire : FLOAT, DOUBLE, NUMERIC, ARRAY, JSON, JSONB, DATE et autres types complexes. À partir de Hologres V1.3.22, les colonnes DATE sont prises en charge comme clés primaires. Pour utiliser une colonne DATE comme clé primaire, vérifiez la version de votre instance et mettez-la à niveau si nécessaire. Pour plus d'informations, consultez les rubriques Détails de l'instance et Mettre à niveau une instance.

  • Les tables orientées ligne et les tables hybrides ligne-colonne nécessitent une clé primaire. Les tables orientées colonne n'en nécessitent pas.

  • Vous ne pouvez pas modifier les clés primaires après la création de la table. Pour changer la clé primaire, vous devez recréer la table.

Exemples

Les exemples suivants utilisent la syntaxe disponible à partir de Hologres V2.1. Si votre instance exécute la version V2.0 ou antérieure, remplacez la clause WITH (property = 'value') par des instructions CALL set_table_property. Pour plus d'informations, consultez la rubrique CREATE TABLE.

  • Créez une table orientée colonne avec une clé primaire simple.

    • Syntaxe prise en charge à partir de la version V2.1 :

      CREATE TABLE tbl_1 (
          id bigint NOT NULL,
          name text NOT NULL,
          age bigint NOT NULL,
          class text,
          reg_timestamp timestamptz NOT NULL,
          PRIMARY KEY (id)
      )
      WITH (
          orientation = 'column',
          distribution_key = 'id',
          clustering_key = 'age',
          event_time_column = 'reg_timestamp',
          bitmap_columns = 'name,class',
          dictionary_encoding_columns = 'class:auto'
      );
    • Syntaxe prise en charge dans toutes les versions :

      BEGIN;
      CREATE TABLE tbl_1 (
       id bigint NOT NULL,
       name text NOT NULL,
       age bigint,
       class text,
       reg_timestamp timestamptz,
      PRIMARY KEY (id)
      );
      CALL set_table_property('tbl_1', 'orientation', 'column');
      CALL set_table_property('tbl_1', 'distribution_key', 'id');
      CALL set_table_property('tbl_1', 'clustering_key', 'age');
      CALL set_table_property('tbl_1', 'event_time_column', 'reg_timestamp');
      CALL set_table_property('tbl_1', 'bitmap_columns', 'name,class');
      CALL set_table_property('tbl_1', 'dictionary_encoding_columns', 'class:auto');
      COMMIT;
  • Créez une table orientée colonne avec une clé primaire composite (deux colonnes).

    • Syntaxe prise en charge à partir de la version V2.1 :

      CREATE TABLE tbl_1 (
          id bigint NOT NULL,
          name text NOT NULL,
          age bigint NOT NULL,
          class text NOT NULL,
          reg_timestamp timestamptz NOT NULL,
          PRIMARY KEY (id,age)
      )
      WITH (
          orientation = 'column',
          distribution_key = 'id',
          clustering_key = 'age',
          event_time_column = 'reg_timestamp',
          bitmap_columns = 'name,class',
          dictionary_encoding_columns = 'class:auto'
      );
    • Syntaxe prise en charge dans toutes les versions :

      BEGIN;
      CREATE TABLE tbl_2 (
       id bigint NOT NULL,
       name text NOT NULL,
       age bigint NOT NULL,
       class text NOT NULL,
       reg_timestamp timestamptz NOT NULL,
      PRIMARY KEY (id,age)
      );
      CALL set_table_property('tbl_2', 'orientation', 'column');
      CALL set_table_property('tbl_2', 'distribution_key', 'id');
      CALL set_table_property('tbl_2', 'clustering_key', 'age');
      CALL set_table_property('tbl_2', 'event_time_column', 'reg_timestamp');
      CALL set_table_property('tbl_2', 'bitmap_columns', 'name,class');
      CALL set_table_property('tbl_2', 'dictionary_encoding_columns', 'class:auto');
      COMMIT;
  • Créez une table orientée ligne avec une clé primaire.

    • Syntaxe prise en charge à partir de la version V2.1 :

      CREATE TABLE public.tbl_row (
          id text NOT NULL,
          name text NOT NULL,
          class text,
          PRIMARY KEY (id)
      )
      WITH (
          orientation = 'row',
          distribution_key = 'id',
          clustering_key = 'id'
      );
    • Syntaxe prise en charge dans toutes les versions :

      BEGIN;
      CREATE TABLE public.tbl_row (
          id text NOT NULL,
          name text NOT NULL,
          class text ,
      PRIMARY KEY (id)
      );
      CALL set_table_property('public.tbl_row', 'orientation', 'row');
      CALL set_table_property('public.tbl_row', 'clustering_key', 'id');
      CALL set_table_property('public.tbl_row', 'distribution_key', 'id');
      COMMIT;
  • Créez une table partitionnée avec une clé primaire.

    • Syntaxe prise en charge à partir de la version V2.1 :

      BEGIN;
      CREATE TABLE public.tbl_parent(
        a text , 
        b int, 
        c timestamp, 
        d text,
        ds text,
        PRIMARY KEY (ds,b)
        )
       PARTITION BY LIST(ds)
       WITH ( orientation = 'column');
      CREATE TABLE public.tbl_child_1 PARTITION OF public.tbl_parent FOR VALUES IN('20221207');
      CREATE TABLE public.tbl_child_2 PARTITION OF public.tbl_parent FOR VALUES IN('20221208');
      COMMIT;
    • Syntaxe prise en charge dans toutes les versions :

      BEGIN;
      CREATE TABLE public.tbl_parent(
        a text , 
        b int, 
        c timestamp, 
        d text,
        ds text,
        PRIMARY KEY (ds,b)
        )
        PARTITION BY LIST(ds);
      CALL set_table_property('public.tbl_parent', 'orientation', 'column');
      CREATE TABLE public.tbl_child_1 PARTITION OF public.tbl_parent FOR VALUES IN('20221207');
      CREATE TABLE public.tbl_child_2 PARTITION OF public.tbl_parent FOR VALUES IN('20221208');
      COMMIT;

Rubriques connexes