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



Answers

如果您使用的是SQLite版本3.3+,則可以使用以下方式輕鬆創建表格:

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

以同樣的方式,只有通過使用以下內容才能刪除表:

drop table if exists TableName
Question

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

我並不是要求不可靠的方法來檢查表上的“select *”是否返回錯誤(這是個好主意嗎?)。

原因是這樣的:

在我的程序中,如果它們不存在,我需要創建並填充一些表。

如果它們已經存在,我需要更新一些表格。

我是否應該採取一些其他途徑來表示已經創建了相關表格 - 例如,通過在我的程序初始化/設置文件中創建/放置/設置某個標記在磁盤上或其他東西?

或者我的方法是否有意義?




以下代碼在表存在時返回1,如果表不存在則返回0。

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



你可以嘗試:

SELECT name FROM sqlite_master WHERE name='table_name'



使用

SELECT 1 FROM table LIMIT 1;

以防止讀取所有記錄。




這是我使用的功能:

給定一個SQLDatabase Object = db

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



SQLite表名不區分大小寫,但默認情況下比較是區分大小寫的。 為了在所有情況下都能正常工作,您需要添加COLLATE NOCASE

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



使用:

PRAGMA table_info(your_table_name)

如果結果表為空,那麼your_table_name不存在。

文檔:

PRAGMA schema.table_info(table-name);

此編譯指示為指定表中的每列返回一行。 結果集中的列包括列名稱,數據類型,列是否可以為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



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



Links



Tags

sqlite