当前位置:  开发笔记 > 编程语言 > 正文

如何在SQLite中检查表是否存在?

如何解决《如何在SQLite中检查表是否存在?》经验,为你挑选了13个好方法。

我如何可靠地检查SQLite,是否存在特定的用户表?

我不是要求不可靠的方法,比如检查表上的"select*"是否返回错误(这是一个好主意吗?).

原因是这样的:

在我的程序中,我需要创建并填充一些表,如果它们不存在的话.

如果它们已经存在,我需要更新一些表.

我是否应该采取其他路径来表示已经创建了相关表格 - 例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志或其他东西?

或者我的方法有意义吗?



1> PoorLuzer..:

我错过了FAQ条目.

无论如何,为了将来参考,完整的查询是:

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

{table_name}要检查的表的名称在哪里.

文档部分供参考:数据库文件格式.2.6.存储SQL数据库模式


@Pawel Veselov:标题为"SQLite数据库的文件格式"的部分:http://www.sqlite.org/fileformat2.html
但是,这不适用于TEMP表.TEMP表位于"sqlite_temp_master"中.
这会返回一个布尔值吗?如果表格存在或不存在,它会返回什么?
@Dagrooms这将返回一个指定名称的表列表; 也就是说,光标的计数为0(不存在)或计数为1(确实存在).
哪些SQLite文档涵盖了这些系统表?
@PoorLuzer你可以更新你的答案如何检查查询结果以确定表是否存在?它将节省新手的时间

2> 小智..:

如果您使用的是SQLite版本3.3+,则可以轻松创建一个表格:

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

以同样的方式,您可以通过使用以下表来删除表:

drop table if exists TableName


这不应该是公认的答案,但如果问题措辞不同则会这样.在删除或创建之前,OP没有询问如何检查表.如果必须查询可能不存在的表,该怎么办?这是我现在面临的问题,并且接受的答案在这个一般问题陈述中效果最好.这是一个很好的快速替代方案.
索引也有类似的构造:**如果不存在则创建索引TableName上的TableName_col1(col1)**
请注意,`create table`语句不完整(缺少表列规范).

3> Stephen Quan..:

一种变化是使用SELECT COUNT(*)而不是SELECT NAME,即

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

如果表不存在,则返回0,否则返回1.这可能对您的编程很有用,因为数字结果更快/更容易处理.下面说明如何使用SQLiteDatabase,Cursor,带参数的rawQuery在Android中执行此操作.

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;
}


我相信"SELECT 1"会更快.

4> Galwegian..:

你可以尝试:

SELECT name FROM sqlite_master WHERE name='table_name'


type = table会很有用

5> Rakesh Chaud..:

如果您收到"表已存在"错误,请在SQL字符串中进行如下更改:

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

这样就可以避免异常.



6> Brice M. Dem..:

SQLite表名称不区分大小写,但默认情况下比较区分大小写.要在所有情况下使其正常工作,您需要添加COLLATE NOCASE.

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



7> 小智..:

使用:

PRAGMA table_info(your_table_name)

如果结果表为空your_table_name,则不存在.

文档:

PRAGMA schema.table_info(table-name);

该pragma为命名表中的每列返回一行.结果集中的列包括列名,数据类型,列是否可以为NULL以及列的默认值.对于不属于主键的列,结果集中的"pk"列为零,并且是主键中作为主键一部分的列的列的索引.

table_info pragma中指定的表也可以是视图.

示例输出:

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


这是以编程方式获取列定义的好方法

8> Anton Gogole..:

看到这个:

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



9> user655489..:

如果你正在使用fmdb,我想你可以导入FMDatabaseAdditions并使用bool函数:

[yourfmdbDatabase tableExists:tableName].



10> 小智..:

如果表存在,则以下代码返回1;如果表不存在,则返回0.

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



11> Scott Deerwe..:

请注意,要检查TEMP数据库中是否存在表,必须使用sqlite_temp_master而不是sqlite_master:

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



12> 小智..:

这是我使用的功能:

给定一个SQLDatabase Object = db

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



13> 小智..:

使用此代码:

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

如果返回的数组计数等于1,则表示该表存在.否则它不存在.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有