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