Tous les produits
Search
Centre de documentation

Lindorm:Colonnes génériques

Dernière mise à jour :Aug 11, 2026

Lorsque le schéma d'une table comporte des centaines ou des milliers de colonnes non définies à l'avance — un cas fréquent dans les scénarios liés à l'Internet des véhicules (IoV) — il n'est pas viable de définir chaque colonne au préalable. L'ajout systématique de nouvelles colonnes via ALTER TABLE est lent et coûteux en termes d'exploitation.

Lindorm prend en charge les colonnes dynamiques pour l'écriture et l'interrogation de données sans schéma fixe, mais ces colonnes n'acceptent que le type de données VARBINARY. Les colonnes génériques étendent cette fonctionnalité en vous permettant de déclarer un modèle de nommage et un type de données cible : toute colonne écrite dans la table dont le nom correspond au modèle est automatiquement acceptée et convertie vers ce type.

Fonctionnement

Déclarez une colonne générique dans la clause WITH à l'aide de la propriété wildcard_column. Le nom de la colonne contient un ou plusieurs caractères génériques :

Caractère générique Correspondance
* Une séquence de caractères de n'importe quelle longueur, y compris vide
? Exactement un caractère

Par exemple, la déclaration c* INT signifie que toute colonne dont le nom commence par c — telle que c10, c11 ou c20 — est acceptée et sa valeur est convertie en INT.

Au moment de l'écriture, Lindorm fait correspondre le nom de la colonne entrante avec les modèles déclarés. Lors de l'interrogation, utilisez les noms réels des colonnes (et non les modèles génériques) dans les clauses SELECT et WHERE.

Prérequis

DDL

Créer une table avec des colonnes génériques

L'instruction suivante crée la table tb avec deux colonnes génériques : c2* (BIGINT) et c3* (VARCHAR). Toutes deux sont déclarées dans la clause WITH via wildcard_column.

CREATE TABLE tb (
  pk  INTEGER,
  c1  VARCHAR,
  `c2*` BIGINT,
  `c3*` VARCHAR,
  PRIMARY KEY (pk)
) WITH (wildcard_column='c2*,c3*');

Après la création de cette table :

  • Toute colonne dont le nom commence par c2 (par exemple, c2, c21, c22) est acceptée. Si sa valeur n'est pas de type BIGINT, elle est convertie en BIGINT.

  • Toute colonne dont le nom commence par c3 (par exemple, c32, c33, c35) est acceptée. Si sa valeur n'est pas de type VARCHAR, elle est convertie en VARCHAR.

Créer un index de recherche sur des colonnes génériques

Vous pouvez créer des index de recherche sur des colonnes génériques. L'index couvre toutes les colonnes dont les noms correspondent aux modèles génériques au moment de l'écriture.

CREATE INDEX idx USING SEARCH ON tb (`c2*`, `c3*`);
La création d'index secondaires sur des colonnes génériques n'est pas possible. L'instruction suivante n'est pas prise en charge :
CREATE INDEX idx ON tb (c2*);

DML

Écrire des données

En utilisant la table tb créée ci-dessus, l'instruction UPSERT suivante écrit une ligne contenant des colonnes correspondant aux deux modèles génériques (c2, c21, c22 correspondent à c2* ; c31 correspond à c3*) :

UPSERT INTO tb (pk, c1, c2, c21, c22, c31)
VALUES (1, 'a1', 2, 21, 22, 'c3');

Chaque colonne de l'instruction doit satisfaire à deux conditions :

  • Son nom correspond à l'un des modèles génériques déclarés.

  • Sa valeur est compatible avec le type de données de la colonne générique correspondante (ou peut être convertie vers ce type).

Interroger des données

Utilisez les noms réels des colonnes — et non les modèles génériques — dans les clauses SELECT et WHERE. La requête suivante lit les données de la table tb créée et remplie précédemment :

SELECT pk, c1, c2, c21, c31
FROM tb
WHERE c21 > 10 AND c31 < 'c300';

Pour interroger toutes les colonnes d'une table contenant des colonnes génériques, incluez une clause LIMIT :

SELECT * FROM tb LIMIT 10;

Limitations

Limitation Détail
Clés primaires Les colonnes génériques ne peuvent pas être utilisées comme clés primaires.
SELECT * Doit inclure une clause LIMIT lorsque la table contient des colonnes génériques.
Types d'index Seuls les index de recherche sont pris en charge. Les index secondaires ne sont pas pris en charge.
Conditions de requête Seuls les noms réels des colonnes peuvent être utilisés dans les listes SELECT et les clauses WHERE. Les modèles génériques ne peuvent pas être utilisés comme conditions.

Les instructions suivantes utilisent des modèles génériques comme conditions de requête et ne sont pas prises en charge :

-- Not supported: wildcard pattern in SELECT list
SELECT c1*, c2 FROM tb WHERE c2 > 10;

-- Not supported: wildcard pattern in WHERE clause
SELECT c1*, c2 FROM tb WHERE c1* > 10;

Utilisez plutôt les noms réels des colonnes :

-- Supported
SELECT pk, c1, c2, c21, c31 FROM tb WHERE c21 > 10 AND c31 < 'c300';