Pregunta ¿Cómo controlo en SQLite si existe una tabla?


Cómo puedo, seguramente, compruebe en SQLite, si existe una tabla de usuario particular?

No estoy pidiendo formas poco confiables, como comprobar si un "select *" en la tabla arrojó un error o no (¿es una buena idea?).

La razón es así:

En mi programa, necesito crear y llenar algunas tablas si aún no existen.

Si ya existen, necesito actualizar algunas tablas.

¿Debo tomar alguna otra ruta para señalar que las tablas en cuestión ya han sido creadas, por ejemplo, creando / poniendo / configurando un determinado indicador en el archivo de configuración / inicialización de mi programa en el disco o algo así?

¿O mi enfoque tiene sentido?


759
2017-10-21 14:22


origen


Respuestas:


Me perdí esa entrada de preguntas frecuentes.

De todos modos, para referencia futura, la consulta completa es:

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

Dónde {table_name} es el nombre de la tabla para verificar.

Sección de documentación para referencia: Formato de archivo de base de datos. 2.6. Almacenamiento del esquema de base de datos SQL


865
2017-10-21 22:57



Si está utilizando la versión 3.3+ de SQLite, puede crear fácilmente una tabla con:

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

De la misma manera, puede eliminar una tabla solo si existe al usar:

drop table if exists TableName

481
2018-03-05 17:36



Una variación sería usar SELECT COUNT (*) en lugar de SELECT NAME, es decir

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

Esto devolverá 0, si la tabla no existe, 1 si lo hace. Esto probablemente sea útil en su programación ya que un resultado numérico es más rápido / más fácil de procesar. A continuación se muestra cómo harías esto en Android usando SQLiteDatabase, Cursor, rawQuery con parámetros.

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 podrías intentar:

SELECT name FROM sqlite_master WHERE name='table_name'

38
2017-10-21 14:25



Si obtiene el error "la tabla ya existe", realice los cambios en la cadena SQL de la siguiente manera:

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

De esta manera puedes evitar las excepciones.


34
2017-10-20 11:46



Los nombres de las tablas SQLite no distinguen entre mayúsculas y minúsculas, pero la comparación distingue entre mayúsculas y minúsculas por defecto. Para que esto funcione correctamente en todos los casos, debe agregar COLLATE NOCASE.

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

26
2018-02-21 20:26



Utilizar:

PRAGMA table_info(your_table_name)

Si la tabla resultante está vacía, entonces your_table_name no existe

Documentación:

PRAGMA schema.table_info (nombre-tabla);

Este pragma devuelve una fila para cada columna en la tabla nombrada. Las columnas en el conjunto de resultados incluyen el nombre de la columna, el tipo de datos, si la columna puede ser NULL o no, y el valor predeterminado para la columna. La columna "pk" en el conjunto de resultados es cero para las columnas que no son parte de la clave principal, y es el índice de la columna en la clave principal para las columnas que forman parte de la clave principal.

La tabla nombrada en table_info pragma también puede ser una vista.

Ejemplo de salida:

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



Ver esta:

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

25
2017-10-21 14:25