Frage Wie überprüfe ich in SQLite, ob eine Tabelle existiert?


Wie mache ich, zuverlässig, in SQLite einchecken, ob eine bestimmte Benutzertabelle existiert?

Ich frage nicht nach unzuverlässigen Möglichkeiten, wie zu prüfen, ob ein "select *" auf der Tabelle einen Fehler zurückgegeben hat oder nicht (ist das überhaupt eine gute Idee?).

Der Grund ist wie folgt:

In meinem Programm muss ich einige Tabellen erstellen und dann auffüllen, wenn sie nicht bereits vorhanden sind.

Wenn sie bereits existieren, muss ich einige Tabellen aktualisieren.

Sollte ich stattdessen einen anderen Weg nehmen, um zu signalisieren, dass die fraglichen Tabellen bereits erstellt wurden - sagen wir zum Beispiel, indem ich ein bestimmtes Flag in meiner Programminitialisierungs- / Einstellungsdatei auf der Festplatte anlege / setze / setze?

Oder macht mein Ansatz Sinn?


759
2017-10-21 14:22


Ursprung


Antworten:


Ich habe diesen FAQ-Eintrag verpasst.

Wie auch immer, für die zukünftige Referenz ist die vollständige Abfrage:

SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';

Woher {table_name} ist der Name der zu überprüfenden Tabelle.

Dokumentationsabschnitt als Referenz: Datenbankdateiformat 2.6. Speicherung des SQL-Datenbankschemas


865
2017-10-21 22:57



Wenn Sie SQLite Version 3.3+ verwenden, können Sie einfach eine Tabelle erstellen mit:

create table if not exists TableName (col1 typ1, ..., colN typN)

Auf die gleiche Weise können Sie eine Tabelle nur dann entfernen, wenn sie existiert:

drop table if exists TableName

481
2018-03-05 17:36



Eine Variation wäre die Verwendung von SELECT COUNT (*) anstelle von SELECT NAME, d.

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

Dies ergibt 0, wenn die Tabelle nicht existiert, 1 falls dies der Fall ist. Dies ist wahrscheinlich in Ihrer Programmierung nützlich, da ein numerisches Ergebnis schneller / einfacher zu verarbeiten ist. Im Folgenden wird veranschaulicht, wie Sie dies in Android mithilfe von SQLiteDatabase, Cursor, rawQuery mit Parametern tun würden.

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}

155
2018-01-11 22:20



Du könntest es versuchen:

SELECT name FROM sqlite_master WHERE name='table_name'

38
2017-10-21 14:25



Wenn Sie einen Fehler "Tabelle ist bereits vorhanden" erhalten, nehmen Sie Änderungen in der SQL-Zeichenfolge wie folgt vor:

CREATE table IF NOT EXISTS table_name (para1,para2);

Auf diese Weise können Sie die Ausnahmen vermeiden.


34
2017-10-20 11:46



Bei SQLite-Tabellennamen wird die Groß- / Kleinschreibung nicht berücksichtigt. Beim Vergleich wird jedoch standardmäßig die Groß- / Kleinschreibung berücksichtigt. Damit dies in allen Fällen ordnungsgemäß funktioniert, müssen Sie hinzufügen COLLATE NOCASE.

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE

26
2018-02-21 20:26



Benutzen:

PRAGMA table_info(your_table_name)

Wenn die resultierende Tabelle leer ist, dann your_table_name existiert nicht.

Dokumentation:

PRAGMA schema.table_info (Tabellenname);

Dieses Pragma gibt für jede Spalte in der benannten Tabelle eine Zeile zurück. Spalten in der Ergebnismenge enthalten den Spaltennamen, den Datentyp, ob die Spalte NULL sein kann oder nicht, und den Standardwert für die Spalte. Die Spalte "pk" in der Ergebnismenge ist Null für Spalten, die nicht Teil des Primärschlüssels sind, und ist der Index der Spalte im Primärschlüssel für Spalten, die Teil des Primärschlüssels sind.

Die im pragma table_info genannte Tabelle kann auch eine View sein.

Beispielausgabe:

cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0

26
2017-09-29 18:06



Sehen Dies:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

25
2017-10-21 14:25



Wenn du es benutzt fmdbIch denke du kannst es einfach FMDatabaseAdditionen importieren und benutze die bool-Funktion:

[yourfmdbDatabase tableExists:tableName].

22
2018-04-06 04:46



Der folgende Code gibt 1 zurück, wenn die Tabelle vorhanden ist, oder 0, wenn die Tabelle nicht existiert.

SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"

13
2017-08-08 13:50