tool - sqlite是什麼




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

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

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

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

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

原因是這樣的:

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

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

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

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


一種變化是使用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;
}

你可以嘗試:

SELECT name FROM sqlite_master WHERE name='table_name'

使用

SELECT 1 FROM table LIMIT 1;

以防止讀取所有記錄。


使用:

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

在我看來,使用簡單的SELECT查詢非常可靠。 大多數情況下,它可以檢查許多不同數據庫類型(SQLite / MySQL)中的表存在情況。

SELECT 1 FROM table;

當您可以使用其他可靠機制來確定查詢是否成功時(例如,您通過Qt QSqlQuery查詢數據庫),這是有意義的。


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

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

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

drop table if exists TableName

如果您收到“表已存在”錯誤,請在SQL字符串中進行更改,如下所示:

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

這樣你可以避免例外。


我錯過了那個FAQ條目。

無論如何,為了將來的參考,完整的查詢是:

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

其中{table_name}是要檢查的表的名稱。

文檔部分以供參考: 數據庫文件格式。 2.6。 存儲SQL數據庫模式


看到this

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

這是我使用的功能:

給定一個SQLDatabase Object = db

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

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