2008-10-01 6 views
15

Ich möchte mit einer SQL-Abfrage herausfinden, ob ein Index UNIQUE ist oder nicht. Ich verwende SQLite 3.Wie finde ich heraus, ob ein SQLite-Index eindeutig ist? (Mit SQL)

ich zwei Ansätze versucht:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1' 

Diese liefert Informationen über den Index ("Typ", "Name", "tbl_name", "Rootpage" und "SQL"). Beachten Sie, dass die Spalte sql 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").

Haben Sie noch weitere Vorschläge?

Bearbeiten: Das obige Beispiel ist für einen automatisch generierten Index, aber meine Frage bezieht sich auf Indizes im Allgemeinen. Zum Beispiel kann ich einen Index mit "CREATE UNIQUE INDEX index1 ON visit (Benutzer, Datum)" erstellen. Es scheint, dass kein SQL-Befehl angezeigt wird, wenn mein neuer Index UNIQUE ist oder nicht.

+0

Können Sie ein Beispiel geben, wo ein automatisch generierter Index nicht eindeutig ist? Die, die ich gesehen habe, waren immer einzigartig. – finnw

+0

Autoindex wird für den Primärschlüssel generiert, der per Definition eindeutig ist – Noah

Antwort

31
PRAGMA INDEX_LIST('table_name'); 

Returns eine Tabelle mit 3 Spalten:

  1. seq Uniqu e numerische ID Index
  2. name Name des Index
  3. unique Einmaligkeit Flag (ungleich Null, wenn UNIQUE Index.)

dann durch die resultierenden Reihen nur Schleife, bis Sie den Namen des Index sehen Sie wollen Query (leider können Sie keine WHERE-Klausel in einer PRAGMA-Anweisung haben.)

1

Sie können programmgesteuert eine SELECT-Anweisung erstellen, um festzustellen, ob Tupel auf 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 Tabellen abgeleitet unterstützt (ich habe noch die Notwendigkeit zu haben, so dass ich weiß nicht, Off-Hand), können Sie machen dies noch prägnanter:

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

Dieses eine einzige Reihe Ergebnismenge zurück, Bezeichnet die Anzahl der doppelten Tupel-Sets. Wenn positiv, ist Ihr Index nicht eindeutig.

+0

Ja, das funktioniert in sqlite3. – finnw

+2

Natürlich wird dies Ihnen immer noch nicht sagen, ob der Index Duplikate erlaubt, aber es gibt noch keine. – finnw

+0

@finnw: ah ja, du hast einen guten Punkt da :) – dland

5

Da keiner der mit einer guten Antwort kommen, ich denke, die beste Lösung ist folgendes:

  • Wenn der Index mit „sqlite_autoindex“ beginnt, ist es ein automatisch generierter Index für eine einzelne UNIQUE Spalte
  • Andernfalls 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 'index' type = und sQL LIKE '% UNIQUE%'

+0

ist, dass der erste Punkt nicht ganz richtig ist. Wenn der Index mit "sqlite_autoindex" beginnt, handelt es sich um einen automatisch generierten Index für den Primärschlüssel. Aber wenn die PK mehrere Spalten ist, dann ist "single UNIQUE column" nicht wahr. Ich habe hier einen vor mir, der eine zusammengesetzte PK ist, d. H. Zwei Spalten, die zusammen einzigartig sind (aber nicht alleine sind). – MemeDeveloper

1

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 Tabellen sqlite_master oder sqlite_temp_master abhängig davon sein, ob die indizierte Tabelle vorübergehend ist.

2) Sie müssen sich für Tabellennamen und Spalten achten, dass die Teil unique enthalten, so möchten Sie verwenden:

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

finden Sie in der SQLite-Website Dokumentation auf Create Index

Verwandte Themen