Как проверить в SQLite, существует ли таблица? - PullRequest
824 голосов
/ 21 октября 2009

Как мне, надежно , проверить в SQLite, существует ли конкретная пользовательская таблица?

Я не прошу ненадежных способов, таких как проверка, вернул ли «select *» в таблице ошибку или нет (это даже хорошая идея?).

Причина такова:

В моей программе мне нужно создать, а затем заполнить некоторые таблицы, если они еще не существуют.

Если они уже существуют, мне нужно обновить некоторые таблицы.

Должен ли я вместо этого использовать другой путь, чтобы указать, что соответствующие таблицы уже созданы - например, путем создания / установки / установки определенного флага в файле инициализации / настройки моей программы на диске или что-то в этом роде?

Или мой подход имеет смысл?

Ответы [ 21 ]

933 голосов
/ 22 октября 2009

Я пропустил эту запись FAQ.

В любом случае, для дальнейшего использования полный запрос:

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

Где {table_name} - имя таблицы для проверки.

Раздел документации для справки: Формат файла базы данных. 2.6. Хранение схемы базы данных SQL

520 голосов
/ 05 марта 2011

Если вы используете SQLite версии 3.3+, вы можете легко создать таблицу с:

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

Таким же образом вы можете удалить таблицу, только если она существует, используя:

drop table if exists TableName
166 голосов
/ 12 января 2012

Вариантом будет использование SELECT COUNT (*) вместо SELECT NAME, т.е.

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

Возвращает 0, если таблица не существует, 1, если она существует. Это, вероятно, полезно в вашем программировании, поскольку числовой результат обрабатывается быстрее / проще. Ниже показано, как вы можете сделать это в Android, используя SQLiteDatabase, Cursor, rawQuery с параметрами.

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;
}
39 голосов
/ 21 октября 2009

Вы можете попробовать:

SELECT name FROM sqlite_master WHERE name='table_name'
33 голосов
/ 20 октября 2015

Если вы получаете сообщение об ошибке «таблица уже существует», внесите изменения в строку SQL, как показано ниже:

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

Таким образом, вы можете избежать исключений.

32 голосов
/ 22 февраля 2014

Имена таблиц SQLite нечувствительны к регистру, но сравнение по умолчанию чувствительно к регистру. Для правильной работы во всех случаях необходимо добавить COLLATE NOCASE.

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE
31 голосов
/ 29 сентября 2014

Использование:

PRAGMA table_info(your_table_name)

Если полученная таблица пуста, то your_table_name не существует.

Документация:

PRAGMA schema.table_info (имя таблицы);

Эта прагма возвращает одну строку для каждого столбца в именованной таблице. Столбцы в наборе результатов включают имя столбца, тип данных, может ли столбец иметь значение NULL и значение по умолчанию для столбца. Столбец «pk» в наборе результатов равен нулю для столбцов, которые не являются частью первичного ключа, и является индексом столбца в первичном ключе для столбцов, которые являются частью первичного ключа.

Таблица, названная в прагме table_info, также может быть представлением.

Пример вывода:

cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0
29 голосов
/ 21 октября 2009

См. это :

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
22 голосов
/ 06 апреля 2012

Если вы используете fmdb , я думаю, вы можете просто импортировать FMDatabaseAdditions и использовать функцию bool:

[yourfmdbDatabase tableExists:tableName].
13 голосов
/ 08 августа 2011

Следующий код возвращает 1, если таблица существует, или 0, если таблица не существует.

SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...