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.

War es hilfreich?

Lösung

PRAGMA INDEX_LIST('table_name');

Gibt eine Tabelle mit drei Spalten:

  1. seq eindeutige numerische ID des Index
  2. name Name des Index
  3. unique Einmaligkeit Flag (ungleich Null, wenn UNIQUE 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top