2017-10-09 5 views
1

Ich versuche herauszufinden, ob eine bestimmte Spalte indiziert ist (für sich). Mit anderen Worten, ich möchte keine mehrspaltigen Indizes ziehen.Finde einzelne Spaltenindizes

Kann mir jemand helfen, dies neu zu schreiben, um nur den einspaltigen Index zu ziehen?

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

Antwort

0

Sie können die Indizes nach ihrem Namen in einer Unterabfrage gruppieren und dann diejenigen auswählen, die eindeutig sind.

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 

Sie könnten column_name an der inneren und äußeren select -Liste hinzugefügt werden soll; und zum äußeren where -condition. Dies funktioniert wahrscheinlich in diesem Fall wegen der Bedingung col_count = 1, aber im Allgemeinen mit einer trivialen Spalte (nicht mit COUNT, MAX, ...) in der select-Liste, die nicht in der group -Statement aufgeführt ist, führt zu unvorhergesehenen Verhalten, vgl. sql antipattern.

+0

Dies funktioniert nicht. Dies listet weiterhin alle Indizes auf, die diesen Spaltennamen enthalten, unabhängig davon, ob es sich um einen mehrspaltigen Index handelt. – user3299633

+0

Ja, tut mir leid, ich habe einen Fehler gemacht, als ich die Abfrage von meinem Test env nach SO kopiert habe. Sie sollten 'und Spaltenname = 'Spalte' in der inneren Abfrage fallen lassen. Ich habe die Antwort aktualisiert. Wenn Sie bereits den 'column_name' angeben, dann sind keine weiteren Spalten zu 'COUNT' übrig. – sauerburger

+0

Haben Sie immer noch Probleme mit dieser Lösung? – sauerburger

0

Rewritten ohne Unter wählen ...

Damit wird der Tabellen- und Indexnamen für einen bestimmten Index zurück, wo sie auf einer einzigen (nicht näher bezeichnet) Säule

ist
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; 

Dies ist die gleiche für alle einzelnen Spalte Indizes in einer Tabelle

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; 

Schließlich alle einzelnen Spalte Indizes in einer bestimmten Datenbank

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