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

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

原因如下:

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

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

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

或者我的方法有意义吗?


当前回答

您可以编写以下查询来检查表的存在性。

SELECT name FROM sqlite_master WHERE name='table_name'

这里的table_name是你创建的表名。例如

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

并检查

  SELECT name FROM sqlite_master WHERE name='country'

其他回答

这是我的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");
    }
});

另一个是:

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] === 'string')
                        columnNames.push(columnParts[i].split(" ")[0]);
                };
                callback(columnNames);
            }
            else callback(columnNames);
        });
    });
}

如果你使用SQLite 3.3+版本,你可以很容易地创建一个表:

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

以同样的方式,你可以删除一个表,如果它存在,使用:

drop table if exists TableName

您可以编写以下查询来检查表的存在性。

SELECT name FROM sqlite_master WHERE name='table_name'

这里的table_name是你创建的表名。例如

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

并检查

  SELECT name FROM sqlite_master WHERE name='country'

在我看来,使用一个简单的SELECT查询是非常可靠的。最重要的是,它可以检查表是否存在于许多不同的数据库类型(SQLite / MySQL)。

SELECT 1 FROM table;

当您可以使用其他可靠的机制来确定查询是否成功时(例如,您可以通过Qt中的QSqlQuery查询数据库),这是有意义的。

如果你处理Big Table,我用Python和Sqlite做了一个简单的hack,你可以用任何其他语言做出类似的想法

步骤1:不要在create table命令中使用(如果不存在)

您可能知道,如果您之前已经创建了这个表,并且想要重新创建它,那么运行这个命令将会有一个异常,但这将引导我们进入第二步。

步骤2:使用try和except(或其他语言的try和catch)来处理最后一个异常

在这里,如果您之前没有创建表,则try case将继续执行,但如果您已经创建了,则可以将do your process置于except case,您将知道您已经创建了表。

代码如下:

def create_table():
    con = sqlite3.connect("lists.db")
    cur = con.cursor()
    try:
        cur.execute('''CREATE TABLE UNSELECTED(
        ID INTEGER PRIMARY KEY)''')
        print('the table is created Now')

    except sqlite3.OperationalError:
        print('you already created the table before')
    con.commit()
    cur.close()