2017-10-09 4 views
1

J'essaie de savoir si une certaine colonne est indexée (par elle-même). En d'autres termes, je ne veux pas tirer d'index multi-colonnes.Trouver des index de colonne unique

Quelqu'un peut-il m'aider à réécrire cela pour extraire seulement l'index à colonne unique?

select table_name, index_name 
from information_schema.statistics 
where table_schema='schema' and table_name='table' and column_name='column'; 

Répondre

0

Vous pouvez regrouper les indices par leur nom dans une sous-requête, puis sélectionner ceux qui sont uniques.

select index_name from 
    (select index_name, COUNT(*) as col_count 
    from information_schema.statistics 
    where table_schema='schema' and table_name='table' 
    group by index_name) as sub 
where col_count = 1 

Vous pouvez ajouter column_name à la select intérieure et extérieure -list; et à la condition externe where. Cela fonctionnera probablement dans ce cas, à cause de la condition col_count = 1, mais en général ayant une colonne trivial (n'utilisant pas COUNT, MAX, ...) dans la liste select qui n'est pas répertoriée dans l'état group, conduit à imprévu comportement, cf. sql antipattern.

+0

Cela ne fonctionne pas. Cela répertorie toujours tous les index qui ont ce nom de colonne, qu'il s'agisse d'un index unique ou multi-colonnes. – user3299633

+0

Oui, désolé, j'ai fait une erreur, quand j'ai copié la requête de mon test env à SO. Vous devriez supprimer 'et column_name = 'column'' dans la requête interne. J'ai mis à jour la réponse. Si vous spécifiez déjà 'column_name', il n'y a plus d'autres colonnes à COUNT. – sauerburger

+0

Avez-vous encore des problèmes avec cette solution? – sauerburger

0

Réécriture sans sous-select ...

Cela retourne le nom de table et l'index pour un index particulier où il se trouve sur une seule colonne (non spécifié)

SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema='schema' 
AND table_name='table' 
AND index_name = 'index' 
GROUP BY table_name, index_name 
HAVING COUNT(*) = 1; 

C'est le même pour tous les index de colonne unique dans une table

SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema='schema' 
AND table_name='table' 
GROUP BY table_name, index_name 
HAVING COUNT(*) = 1; 

Enfin, tous les index de colonne unique dans une base de données

SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema='schema' 
GROUP BY table_name, index_name 
HAVING COUNT(*) = 1;