sqlite表 - sql判断表是否存在
如何在SQLite中检查表是否存在? (12)
我如何可靠地检查SQLite中是否存在特定的用户表?
我并不是要求不可靠的方法来检查表上的“select *”是否返回错误(这是一个好主意?)。
原因是这样的:
在我的程序中,如果它们不存在,我需要创建并填充一些表。
如果它们已经存在,我需要更新一些表格。
我是否应该采取一些其他途径来表示已经创建了相关表格 - 例如,通过在我的程序初始化/设置文件中创建/放置/设置某个标记在磁盘上或其他东西?
或者我的方法是否有意义?
SQLite表名不区分大小写,但默认情况下比较是区分大小写的。 为了在所有情况下都能正常工作,您需要添加COLLATE NOCASE
。
SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE
一种变化是使用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);
});
});
}