Wie finde ich heraus, ob ein SQLite Index eindeutig ist? (Mit SQL)
-
03-07-2019 - |
Frage
Ich möchte herausfinden, mit einer SQL-Abfrage, ob ein Index UNIQUE ist oder nicht. Ich verwende SQLite 3.
Ich habe versucht, zwei Ansätze:
SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'
Dies gibt Informationen über den Index ( "Typ", "Name", "tbl_name", "Rootpage" und "SQL"). Beachten Sie, dass die SQL-Spalte leer ist, wenn der Index automatisch von SQLite erstellt wird.
PRAGMA index_info(sqlite_autoindex_user_1);
Dies gibt die Spalten im Index ( "seqno", "cid" und "name").
Alle anderen Vorschläge?
Edit: Das obige Beispiel ist für einen automatisch generierten Index, aber meine Frage ist zu Indizes im Allgemeinen. Zum Beispiel kann ich einen Index mit "CREATE UNIQUE INDEX index1 ON Besuch (Benutzer, Datum)" erstellen. Es scheint kein SQL-Befehl wird zeigen, ob mein neuer Index UNIQUE ist oder nicht.
Lösung
PRAGMA INDEX_LIST('table_name');
Gibt eine Tabelle mit drei Spalten:
-
seq
eindeutige numerische ID des Index -
name
Name des Index -
unique
Einmaligkeit Flag (ungleich Null, wennUNIQUE
Index).
Dann einfach eine Schleife durch die resultierenden Zeilen, bis Sie den Namen des Index, den Sie abfragen wollen sehen (leider kann man keine WHERE
-Klausel in einer PRAGMA
Äußerung.)
Andere Tipps
Da keiner der mit einer guten Antwort kommen, ich denke, die beste Lösung, das ist:
- Wenn der Index mit „sqlite_autoindex“ beginnt, ist es ein automatisch generierter Index für eine einzelne UNIQUE Spalte
-
Ansonsten suchen Sie nach dem Schlüsselwort UNIQUE in der SQL-Spalte in der Tabelle sqlite_master, mit so etwas wie folgt aus:
SELECT * FROM sqlite_master WHERE type = 'index' und SQL LIKE '% UNIQUE%
Sie können programmatisch eine select-Anweisung, um zu sehen, ob irgendwelche bauen Tupel mehr als eine Zeile zeigen. Wenn Sie wieder drei Spalten erhalten, foo, bar und baz, erstellen Sie die folgende Abfrage
select count(*) from t
group by foo, bar, baz
having count(*) > 1
Wenn das keine Zeilen zurückgibt, ist der Index nicht eindeutig, da mehr als eine Zeile Karten auf den gegebenen Tupels. Wenn sqlite3 abgeleitete Tabellen unterstützt (ich habe noch die Notwendigkeit zu haben, so dass ich weiß nicht, Off-Hand), können Sie dies machen noch prägnanter:
select count(*) from (
select count(*) from t
group by foo, bar, baz
having count(*) > 1
)
Dies wird eine einzelne Zeile Ergebnismenge zurück, die Zahl der doppelten Tupel-Sets bezeichnet. Wenn positiv, ist der Index nicht eindeutig.
Sie sind in der Nähe:
1) Wenn der Index mit "sqlite_autoindex"
beginnt, es ist ein automatisch generierter Index für den Primärschlüssel. Dies wird jedoch in den sqlite_master
oder sqlite_temp_master
Tabellen sein, abhängig davon abhängen, ob die Tabelle indiziert ist zeitlich begrenzt.
2) Sie müssen sich für Tabellennamen achten und Spalten, die den Teil unique
enthalten, so dass Sie verwenden mögen:
SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'
Sehen Sie die SQLite-Website Dokumentation auf Index erstellen
Wie von SQLite 3.16.0 könnten Sie auch Pragma Funktionen:
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;
Die obige Aussage wird alle Namen von eindeutigen Indizes auflisten.
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;
Die obige Aussage kehrt alle Tabellen und die Spalten, wenn der Spalt Teil eines eindeutigen Index ist.
Von der docs :
Die Tabellenwertfunktionen für PRAGMA Feature wurde in SQLite Version 3.16.0 (2017.01.02) hinzugefügt. Frühere Versionen von SQLite können diese Funktion nicht verwenden.