Utilisez l'instruction ALTER TABLE pour modifier une table partitionnée dans Hologres. Vous pouvez renommer une table partitionnée, attacher une table indépendante en tant que partition enfant ou détacher une partition enfant existante de sa table parente.
Syntaxe
ALTER TABLE [IF EXISTS] table_name RENAME TO new_table_name;
ALTER TABLE [IF EXISTS] table_name ATTACH PARTITION new_partition_name FOR VALUES IN (<string_literal>);
ALTER TABLE [IF EXISTS] table_name DETACH PARTITION partition_name;
Paramètres
| Paramètre | Description |
|---|---|
RENAME |
Renomme la table partitionnée. |
ATTACH PARTITION new_partition_name FOR VALUES IN (<string_literal>) |
Attache une table existante à une table partitionnée en tant que partition enfant. La table doit correspondre à la stratégie de partitionnement et à la clé de partition de la table parente. Des contraintes supplémentaires s'appliquent ; consultez la section Limites. |
DETACH PARTITION partition_name |
Détache une partition d'une table partitionnée. La partition détachée devient une table autonome, sans relation avec l'ancienne table parente. |
Limites
Exigences relatives aux colonnes
Avant d'attacher une table, vérifiez qu'elle respecte les exigences suivantes concernant les colonnes :
La table doit comporter le même nombre de colonnes que la table partitionnée parente.
Le type de données de chaque colonne doit correspondre à celui de la colonne correspondante dans la table parente.
La table doit satisfaire toutes les contraintes NOT NULL définies sur la table parente. Pour une partition par liste qui n'accepte pas les valeurs NULL, ajoutez une contrainte NOT NULL à la colonne de clé de partition, sauf si la clé primaire est une expression.
Règles applicables aux propriétés lors de l'attachement d'une partition enfant
Lorsque vous attachez une table à une table partitionnée, Hologres valide la compatibilité des propriétés entre la table enfant et la table parente au moment de l'attachement. Si une propriété requise ne correspond pas, l'opération d'attachement échoue immédiatement et renvoie une erreur.
Trois règles de compatibilité s'appliquent :
Doit être cohérent : la propriété de la table enfant doit correspondre à celle de la table parente. En cas de non-concordance, l'opération d'attachement échoue et vous devez créer une nouvelle table enfant avec la valeur de propriété correcte.
Pas nécessairement cohérent : la propriété de la table enfant peut différer de celle de la table parente. Si la propriété n'est pas spécifiée sur la table enfant, cette dernière hérite de la valeur de la table parente. Si elle est spécifiée, la valeur indiquée est conservée.
Doit inclure les colonnes indexées de la table parente : la table enfant doit indexer toutes les colonnes indexées par la table parente. La table enfant peut indexer des colonnes supplémentaires non indexées dans la table parente.
Le tableau suivant répertorie toutes les propriétés ainsi que les règles appliquées lors de l'attachement d'une partition enfant :
| Catégorie | Propriété | Description | **Hérité par CREATE TABLE PARTITION OF** |
Règle lors de l'attachement | Conservé après le détachement |
|---|---|---|---|---|---|
| Propriété de table | orientation |
Format de stockage de la table | Oui | Doit être cohérent | Oui |
| Propriété de table | table_group |
Groupe de tables auquel appartient la table ; détermine également le nombre de shards | Oui | Doit être cohérent | Oui |
| Propriété de table | time_to_live_in_seconds |
Période de durée de vie (TTL) de la table | Oui | Pas nécessairement cohérent. Si non spécifié sur la table enfant, hérite de la table parente. Si spécifié, la valeur indiquée est conservée. | Oui |
| Index | primary key |
Clé primaire de la table | Oui | Doit être cohérent | Oui |
| Index | distribution key |
Clé de distribution de la table | Oui | Doit être cohérent | Oui |
| Index | clustering_key |
Index clusterisé : spécifie les colonnes et leur ordre de stockage | Oui | Doit être cohérent | Oui |
| Index | event_time_column |
Clé de segment de la table | Oui | Doit être cohérent | Oui |
| Index | bitmap_columns |
Index bitmap de la table | Oui | Doit inclure les colonnes indexées de la table parente | Oui |
| Index | dictionary_encoding_columns |
Colonnes encodées par dictionnaire de la table | Oui | Doit inclure les colonnes indexées de la table parente | Oui |
| Index | binlog_level |
Indique si la journalisation binaire est activée | Oui | Doit être cohérent | Oui |
| Index | proxima_vectors |
Index vectoriels de la table | Oui | Doit inclure les colonnes indexées de la table parente | Oui |
| Contrainte de colonne | nullable |
Contrainte NOT NULL | Oui | Doit être cohérent | Oui |
| Contrainte de colonne | default value |
Contrainte de valeur par défaut | Oui | Doit être cohérent | Oui |
Exemples
Opérations de base
Les exemples suivants illustrent comment renommer une table partitionnée, attacher une partition et détacher une partition.
-- Rename a partitioned table.
alter table holo_test rename to my_holo_test;
-- Attach the table named my_table as a partition of the table named holo_table.
alter table holo_table attach partition my_table for values in ('2015');
-- Detach the child partitioned table holo_test from the parent partitioned table all_test.
alter table all_test detach partition holo_test;
Remplacer une partition enfant existante
Utilisez une transaction pour remplacer atomiquement une partition enfant existante par de nouvelles données. Ce modèle détache l'ancienne partition, la renomme comme sauvegarde, renomme la nouvelle table pour prendre sa place, puis attache la nouvelle partition, le tout dans un seul bloc de transaction.
Étape 1 : Créez et remplissez la table de remplacement.
-- Create a temporary table.
begin;
drop table if exists "table_20210101_new";
CREATE TABLE "table_20210101_new" (
"colA" integer NOT NULL,
"colB" text NOT NULL,
"colC" numeric(38,10) NOT NULL,
"ds" text NOT NULL,
"process_time" timestamptz NOT NULL DEFAULT now()
);
call set_table_property('table_20210101_new', 'orientation','column');
call set_table_property('table_20210101_new', 'distribution_key','"colA"');
call set_table_property('table_20210101_new', 'event_time_column','process_time');
commit;
--- Import data to the temporary table.
insert into "table_20210101_new" select * from ...;
Étape 2 : Remplacez l'ancienne partition par la nouvelle.
--- Replace an existing child partitioned table with the temporary table.
begin;
-- Detach an existing child partitioned table from the parent partitioned table and make the child partitioned table an independent table.
ALTER TABLE table_parent DETACH PARTITION table_20210101;
-- Rename the independent table.
ALTER TABLE table_20210101 RENAME to table_20210101_backup;
-- Rename the temporary table as the original child partitioned table.
ALTER TABLE table_20210101_new RENAME to table_20210101;
-- Attach the new child partitioned table to the parent partitioned table.
ALTER TABLE table_parent ATTACH PARTITION table_20210101 FOR VALUES in ("20210101");
commit;