Comment puis-je vérifier dans SQLite si une table existe?

Comment puis-je, de manière fiable , vérifier SQLite, si une table utilisateur particulière existe?

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

La raison est comme ceci:

Dans mon programme, je dois créer et remplir certaines tables si elles n’existent pas déjà.

S’ils existent déjà, je dois mettre à jour certaines tables.

Dois-je plutôt prendre un autre chemin pour signaler que les tables en question ont déjà été créées – par exemple, en créant / mettant / définissant un certain drapeau dans mon fichier d’initialisation / parameters de programme sur le disque ou quelque chose?

Ou est-ce que mon approche a du sens?

    J’ai raté cette entrée de FAQ.

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

    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 firebase database. 2.6. Stockage du schéma de firebase database SQL

    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 même, vous ne pouvez supprimer une table que si elle existe en utilisant:

     drop table if exists TableName 

    Une variante serait d’utiliser SELECT COUNT (*) au lieu de SELECT NAME, c.-à-d.

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

    Cela retournera 0 si la table n’existe pas, 1 si elle existe. Ceci est probablement utile dans votre programmation car un résultat numérique est plus rapide / plus facile à traiter. La figure suivante illustre comment procéder dans Android en utilisant SQLiteDatabase, Cursor, rawQuery avec des parameters.

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

    Tu pourrais essayer:

     SELECT name FROM sqlite_master WHERE name='table_name' 

    Si vous obtenez une erreur “table déjà existante”, apportez les modifications suivantes dans la chaîne SQL:

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

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

    Utilisation:

     PRAGMA table_info(your_table_name) 

    Si la table résultante est vide, votre your_table_name n’existe pas.

    Documentation:

    PRAGMA schema.table_info (nom-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 pour la colonne. La colonne “pk” dans le jeu de résultats est égale à zéro pour les colonnes ne faisant pas partie de la clé primaire et correspond à l’index de la colonne dans la clé primaire pour les colonnes faisant 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 

    Les noms de table 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 append COLLATE NOCASE .

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

    Voir ceci :

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

    Si vous utilisez fmdb , je pense que vous pouvez simplement importer FMDatabaseAdditions et utiliser la fonction bool:

     [yourfmdbDatabase tableExists:tableName]. 

    Le code suivant renvoie 1 si la table existe ou 0 si la table n’existe pas.

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

    Notez que pour vérifier si une table existe dans la firebase database TEMP, vous devez utiliser sqlite_temp_master au lieu de sqlite_master :

     SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name'; 

    Voici la fonction que j’ai utilisée:

    Étant donné un object SQLDatabase = db

     public boolean exists(Ssortingng table) { try { db.query("SELECT * FROM " + table); return true; } catch (SQLException e) { return false; } } 

    Utilisez ce code:

     SELECT name FROM sqlite_master WHERE type='table' AND name='yourTableName'; 

    Si le nombre de tableaux renvoyé est égal à 1, cela signifie que la table existe. Sinon, il n’existe pas.

    Utilisation

     SELECT 1 FROM table LIMIT 1; 

    pour empêcher tous les enregistrements d’être lus.

    Utiliser une simple requête SELECT est, à mon avis, assez fiable. Surtout, il peut vérifier l’existence des tables dans de nombreux types de bases de données différents (SQLite / MySQL).

     SELECT 1 FROM table; 

    Il est judicieux d’utiliser un autre mécanisme fiable pour déterminer si la requête a réussi (par exemple, vous interrogez une firebase database via QSqlQuery dans Qt ).

    Vous pouvez écrire la requête suivante pour vérifier l’existence de la table.

     SELECT name FROM sqlite_master WHERE name='table_name' 

    Ici, nom_table est votre nom de table que vous avez créé. Par exemple

      CREATE TABLE IF NOT EXISTS country(country_id INTEGER PRIMARY KEY AUTOINCREMENT, country_code TEXT, country_name TEXT)" 

    et vérifie

      SELECT name FROM sqlite_master WHERE name='country' 

    Ceci est mon code pour SQLite Cordova:

     get_columnNames('LastUpdate', function (data) { if (data.length > 0) { // In data you also have columnNames console.log("Table full"); } else { console.log("Table empty"); } }); 

    Et l’autre:

     function get_columnNames(tableName, callback) { myDb.transaction(function (transaction) { var query_exec = "SELECT name, sql FROM sqlite_master WHERE type='table' AND name ='" + tableName + "'"; transaction.executeSql(query_exec, [], function (tx, results) { var columnNames = []; var len = results.rows.length; if (len>0){ var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx for (i in columnParts) { if (typeof columnParts[i] === 'ssortingng') columnNames.push(columnParts[i].split(" ")[0]); }; callback(columnNames); } else callback(columnNames); }); }); } 

    Je pensais que je mettrais mes 2 centimes à cette discussion, même si elle est plutôt ancienne. Cette requête renvoie le scalaire 1 si la table existe et 0 sinon.

     select case when exists (select 1 from sqlite_master WHERE type='table' and name = 'your_table') then 1 else 0 end as TableExists