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
LindormTable version 2.5.3 ou ultérieure. Pour vérifier ou mettre à niveau votre version, consultez les Notes de version de LindormTable et le guide Mettre à niveau la version mineure du moteur d'une instance Lindorm.
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';