web-dev-qa-db-ja.com

テーブルが存在するかどうかSQLiteをチェックインするにはどうすればいいですか?

どのように私は、 信頼できる 、SQLiteに、特定のユーザーテーブルが存在するかどうかをチェックインする?

私はテーブルの "select *"がエラーを返さないかどうかをチェックするなどの信頼できない方法を求めていません(これは良い考えですらありますか?)。

その理由はこんな感じです:

私のプログラムでは、いくつかのテーブルを作成してから、それらがまだ存在していない場合はそれを追加する必要があります。

それらが既に存在する場合は、いくつかのテーブルを更新する必要があります。

問題のテーブルがすでに作成されていることを示すために、他の方法でパスを作成する必要があります。たとえば、ディスク上のプログラム初期化/設定ファイルに特定のフラグを作成/設定/設定するなどです。

それとも私のアプローチは意味がありますか?

813
PoorLuzer

FAQエントリがありませんでした。

とにかく、今後の参考のために、完全なクエリは次のとおりです。

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

{table_name}はチェックするテーブルの名前です。

参照のためのドキュメンテーションセクション: データベースファイルフォーマット。 2.6。 SQLデータベーススキーマの保存

925
PoorLuzer

SQLiteバージョン3.3以降を使用している場合は、次のようにして簡単にテーブルを作成できます。

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

同様に、テーブルを削除することができるのは、それが存在する場合だけです。

drop table if exists TableName
514
arthur johnston

バリエーションは、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;
}
164
Stephen Quan

あなたが試すことができます:

SELECT name FROM sqlite_master WHERE name='table_name'
39
Galwegian

"table already exists"エラーが発生した場合は、SQL文字列を以下のように変更してください。

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

こうすれば例外を避けることができます。

33

SQLiteのテーブル名は大文字と小文字を区別しませんが、デフォルトでは比較は大文字と小文字を区別します。すべての場合にこれを適切に機能させるには、COLLATE NOCASEを追加する必要があります。

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

つかいます:

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
31
Diego Vélez

this を参照してください。

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

fmdb を使用している場合は、 import FMDatabaseAdditions を使用してbool関数を使用することができると思います。

[yourfmdbDatabase tableExists:tableName].
22
user655489

次のコードは、テーブルが存在する場合は1を返し、テーブルが存在しない場合は0を返します。

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

テーブルがTEMPデータベースに存在するかどうかを確認するには、sqlite_temp_masterの代わりにsqlite_masterを使用する必要があります。

SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';
10

これが私が使った関数です:

SQLDatabase Object = dbが与えられた場合

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

このコードを使用してください:

SELECT name FROM sqlite_master WHERE type='table' AND name='yourTableName';

返された配列カウントが1に等しい場合、それはテーブルが存在することを意味します。それ以外の場合は存在しません。

7
asmad

つかいます

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);
        }
3
Matthew Joughin

単純なSELECTクエリを使用することは、私の意見ではかなり信頼できます。何よりも多くの種類のデータベース(SQLite/MySQL)でテーブルの存在を確認できます。

SELECT 1 FROM table;

クエリが成功したかどうかを判断するために他の信頼できるメカニズムを使用できる場合には意味があります(たとえば、 Qt のQSqlQueryを介してデータベースにクエリを実行します)。

1
Grz

テーブルの存在を確認するために、次のクエリを書くことができます。

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'
1

クラス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で動作しています

0
Douglas Goodall

たとえそれが少し古くても、私はこの議論に私の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
0
Piotr Rodak

テーブルが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)
    }
0
CSE 1994

これは私の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);
        });
    });
}
0
Zappescu