Question

Je veux savoir, avec une requête SQL, si un index est UNIQUE ou non. J'utilise SQLite 3.

J'ai essayé deux approches:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

Ceci retourne des informations sur l'index ("type", "nom", "nom_tbl", "page racine" et "sql"). Notez que la colonne SQL est vide lorsque l'index est créé automatiquement par SQLite.

PRAGMA index_info(sqlite_autoindex_user_1);

Ceci renvoie les colonnes de l'index ("seqno", "cid" et "nom").

D'autres suggestions?

Modifier: L'exemple ci-dessus concerne un index généré automatiquement, mais ma question concerne les index en général. Par exemple, je peux créer un index avec "CREATE UNIQUE INDEX index1 ON visit (utilisateur, date)". Il semble qu'aucune commande SQL n'indique si mon nouvel index est UNIQUE ou non.

Était-ce utile?

La solution

PRAGMA INDEX_LIST('table_name');

Renvoie une table avec 3 colonnes:

  1. seq ID numérique unique de l'index
  2. nom Nom de l'index
  3. unique Indicateur d'unicité (différent de zéro si UNIQUE .)

Ensuite, parcourez simplement les lignes résultantes jusqu'à ce que vous voyiez le nom de l'index que vous souhaitez interroger (malheureusement, vous ne pouvez pas avoir de clause WHERE dans une instruction PRAGMA .)

Autres conseils

Puisque personne ne propose une bonne réponse, je pense que la meilleure solution est la suivante:

  • Si l'index commence par "sqlite_autoindex", il s'agit d'un index généré automatiquement pour une colonne UNIQUE unique
  • Sinon, recherchez le mot clé UNIQUE dans la colonne SQL de la table sqlite_master, avec quelque chose comme ceci:

    SELECT * FROM sqlite_master WHERE type = 'index' ET sql LIKE '% UNIQUE%'

vous pouvez créer par programme une instruction select pour voir si des n-uplets pointent vers plus d'une ligne. Si vous récupérez trois colonnes, foo, bar et baz, créez la requête suivante

select count(*) from t
group by foo, bar, baz
having count(*) > 1

Si cela retourne des lignes, votre index n'est pas unique, car plus d'une ligne est mappée sur le tuple donné. Si sqlite3 prend en charge les tables dérivées (je n’en ai pas encore besoin, donc je ne sais pas tout de suite), vous pouvez rendre ceci encore plus succinct:

select count(*) from (
    select count(*) from t
    group by foo, bar, baz
    having count(*) > 1
)

Ceci renverra un jeu de résultats sur une seule ligne, indiquant le nombre de jeux de tuples en double. S'il est positif, votre index n'est pas unique.

Vous êtes proche:

1) Si l'index commence par "sqlite_autoindex" , il s'agit d'un index généré automatiquement pour la clé primaire. Toutefois, ce sera dans les tables sqlite_master ou sqlite_temp_master , selon que la table indexée est temporaire ou non.

2) Vous devez faire attention aux noms de table et aux colonnes contenant la sous-chaîne unique . Vous souhaitez donc utiliser:

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'

Voir la documentation du site Web sqlite sur Créer un index

À partir de sqlite 3.16.0, vous pouvez également utiliser les fonctions pragma:

SELECT distinct il.name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

L'instruction ci-dessus listera tous les noms d'index uniques.

SELECT DISTINCT m.name as table_name, ii.name as column_name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

L’instruction ci-dessus renvoie toutes les tables et leurs colonnes si la colonne fait partie d’un index unique.

De la docs :

  

Les fonctions table pour la fonctionnalité PRAGMA ont été ajoutées à SQLite version 3.16.0 (2017-01-02). Les versions précédentes de SQLite ne peuvent pas utiliser cette fonctionnalité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top