どのように私は、 信頼できる 、SQLiteに、特定のユーザーテーブルが存在するかどうかをチェックインする?
私はテーブルの "select *"がエラーを返さないかどうかをチェックするなどの信頼できない方法を求めていません(これは良い考えですらありますか?)。
その理由はこんな感じです:
私のプログラムでは、いくつかのテーブルを作成してから、それらがまだ存在していない場合はそれを追加する必要があります。
それらが既に存在する場合は、いくつかのテーブルを更新する必要があります。
問題のテーブルがすでに作成されていることを示すために、他の方法でパスを作成する必要があります。たとえば、ディスク上のプログラム初期化/設定ファイルに特定のフラグを作成/設定/設定するなどです。
それとも私のアプローチは意味がありますか?
FAQエントリがありませんでした。
とにかく、今後の参考のために、完全なクエリは次のとおりです。
SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';
{table_name}
はチェックするテーブルの名前です。
参照のためのドキュメンテーションセクション: データベースファイルフォーマット。 2.6。 SQLデータベーススキーマの保存
SQLiteバージョン3.3以降を使用している場合は、次のようにして簡単にテーブルを作成できます。
create table if not exists TableName (col1 typ1, ..., colN typN)
同様に、テーブルを削除することができるのは、それが存在する場合だけです。
drop table if exists TableName
バリエーションは、SELECT NAMEの代わりにSELECT COUNT(*)を使うことです。
SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';
テーブルが存在しない場合は0を返し、存在する場合は1を返します。これはあなたのプログラミングにおいておそらく役に立つでしょう。なぜなら数値結果はより速く/より処理しやすいからです。以下は、パラメータ付きのSQLiteDatabase、Cursor、rawQueryを使ってAndroidでこれを行う方法を示しています。
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'
"table already exists"エラーが発生した場合は、SQL文字列を以下のように変更してください。
CREATE table IF NOT EXISTS table_name (para1,para2);
こうすれば例外を避けることができます。
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(テーブル名);
このプラグマは、指定されたテーブルの各列に対して1行を返します。結果セットの列には、列名、データ型、列を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
this を参照してください。
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
fmdb を使用している場合は、 import FMDatabaseAdditions を使用してbool関数を使用することができると思います。
[yourfmdbDatabase tableExists:tableName].
次のコードは、テーブルが存在する場合は1を返し、テーブルが存在しない場合は0を返します。
SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"
テーブルがTEMPデータベースに存在するかどうかを確認するには、sqlite_temp_master
の代わりにsqlite_master
を使用する必要があります。
SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';
これが私が使った関数です:
SQLDatabase Object = dbが与えられた場合
public boolean exists(String table) {
try {
db.query("SELECT * FROM " + table);
return true;
} catch (SQLException e) {
return false;
}
}
このコードを使用してください:
SELECT name FROM sqlite_master WHERE type='table' AND name='yourTableName';
返された配列カウントが1に等しい場合、それはテーブルが存在することを意味します。それ以外の場合は存在しません。
つかいます
SELECT 1 FROM table LIMIT 1;
すべてのレコードが読み取られないようにします。
SQLite 3を使用している最新のsqlite-net-pcl nugetパッケージ(1.5.231)を使用して、私が今C#で見つけた最も信頼できる方法は以下の通りです:
var result = database.GetTableInfo(tableName);
if ((result == null) || (result.Count == 0))
{
database.CreateTable<T>(CreateFlags.AllImplicit);
}
単純なSELECTクエリを使用することは、私の意見ではかなり信頼できます。何よりも多くの種類のデータベース(SQLite/MySQL)でテーブルの存在を確認できます。
SELECT 1 FROM table;
クエリが成功したかどうかを判断するために他の信頼できるメカニズムを使用できる場合には意味があります(たとえば、 Qt のQSqlQueryを介してデータベースにクエリを実行します)。
テーブルの存在を確認するために、次のクエリを書くことができます。
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'
クラスCPhoenixDatabase():
def __init__(self, dbname):
self.dbname = dbname
self.conn = sqlite3.connect(dbname)
def is_table(self, table_name):
""" This method seems to be working now"""
query = "SELECT name from sqlite_master WHERE type='table' AND name='{" + table_name + "}';"
cursor = self.conn.execute(query)
result = cursor.fetchone()
if result == None:
return False
else:
return True
注意:これは私のMacのPython 3.7.1で動作しています
たとえそれが少し古くても、私はこの議論に私の2セントを入れると思いました。この問い合わせはテーブルが存在すれば1を、そうでなければ0を返します。
select
case when exists
(select 1 from sqlite_master WHERE type='table' and name = 'your_table')
then 1
else 0
end as TableExists
テーブルがSwiftのデータベースに存在するか存在しない
func tableExists(_ tableName:String) -> Bool {
sqlStatement = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)'"
if sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement, nil) == SQLITE_OK {
if sqlite3_step(compiledStatement) == SQLITE_ROW {
return true
}
else {
return false
}
}
else {
return false
}
sqlite3_finalize(compiledStatement)
}
これは私の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);
});
});
}