Question Comment vérifier dans SQLite si une table existe?


Comment puis-je, fiable, vérifiez SQLite, si une table utilisateur existe?

Je ne demande pas des moyens peu fiables comme vérifier si un "select *" sur la table a retourné une erreur ou pas (est-ce même une bonne idée?).

La raison est comme ceci:

Dans mon programme, j'ai besoin de créer et de remplir certaines tables si elles n'existent pas déjà.

Si elles existent déjà, j'ai besoin de mettre à jour certaines tables.

Devrais-je prendre un autre chemin à la place pour signaler que les tables en question ont déjà été créées - disons, par exemple, en créant / plaçant / définissant un certain drapeau dans mon programme d'initialisation / paramètres sur le disque ou quelque chose?

Ou mon approche a-t-elle un sens?


759
2017-10-21 14:22


origine


Réponses:


J'ai raté cette entrée FAQ.

Quoi qu'il en soit, pour référence future, la requête complète est:

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

{table_name} est le nom de la table à vérifier.

Section de documentation pour référence: Format de fichier de base de données. 2.6. Stockage du schéma de base de données SQL


865
2017-10-21 22:57



Si vous utilisez SQLite version 3.3+, vous pouvez facilement créer une table avec:

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

De la même manière, vous pouvez supprimer une table uniquement si elle existe en utilisant:

drop table if exists TableName

481
2018-03-05 17:36



Une variante consisterait à utiliser SELECT COUNT (*) au lieu de SELECT NAME, c'est-à-dire

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

Cela retournera 0, si la table n'existe pas, 1 si c'est le cas. Ceci est probablement utile dans votre programmation car un résultat numérique est plus rapide / plus facile à traiter. Ce qui suit illustre comment vous le feriez dans Android en utilisant SQLiteDatabase, Cursor, rawQuery avec des paramètres.

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



Tu pourrais essayer:

SELECT name FROM sqlite_master WHERE name='table_name'

38
2017-10-21 14:25



Si vous obtenez une erreur "table existe déjà", apportez les modifications dans la chaîne SQL comme suit:

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

De cette façon, vous pouvez éviter les exceptions.


34
2017-10-20 11:46



Les noms de tables SQLite sont insensibles à la casse, mais la comparaison est sensible à la casse par défaut. Pour que cela fonctionne correctement dans tous les cas, vous devez ajouter COLLATE NOCASE.

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

26
2018-02-21 20:26



Utilisation:

PRAGMA table_info(your_table_name)

Si la table résultante est vide alors your_table_name n'existe pas.

Documentation:

PRAGMA schema.table_info (nom de la table);

Ce pragma renvoie une ligne pour chaque colonne de la table nommée. Les colonnes du jeu de résultats incluent le nom de la colonne, le type de données, si la colonne peut être NULL ou non, et la valeur par défaut de la colonne. La colonne "pk" dans le jeu de résultats est zéro pour les colonnes qui ne font pas partie de la clé primaire et est l'index de la colonne dans la clé primaire pour les colonnes qui font partie de la clé primaire.

La table nommée dans le pragma table_info peut également être une vue.

Exemple de sortie:

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