2009-11-04 5 views

答えて

4

ようにしたいと思い

command.CommandText = 
    "CREATE TABLE if not exists file_hash_list(" + 
     "id INTEGER PRIMARY KEY, " + 
     "hash BLOB NOT NULL, " + 
     "filesize INTEGER NOT NULL);"; 
command.ExecuteNonQuery(); 

のように表には見えます。なぜ2番目のクエリを使用できないのですか? SQLiteでは、インデックスのサイズを指定することは不可能と思われます。しかし、その後、再び、それはSQ_Lite_ある;)

create index 
    myIndex 
on 
    myTable (myColumn) 
+0

「ユニーク」という単語は必須ではなく、元の質問から判断すると、おそらくどちらかと言えません。 – hobbs

+0

右それがどこから来たのか分からない。 –

-7

EDIT:は、私はそれは間違いなく動作しませんbeause (ソリューションとして行われていないべきかを示すことを目的に、このVERY BAD IDEAを残しました)。

filesize INTEGER NOT NULLfilesize INTEGER UNIQUE NOT NULLに置き換えてください。 uniqueキーワードはインデックスを作成します。

別個のCREATE INDEXコマンドを実行することもできます。

Matt Wolfeは、ファイルサイズが一意であると宣言していると指摘しました。明らかに2つの異なるファイルが同じサイズを持つことができるので、本当に悪い考えです。もちろん、これは愚かで、明らかにOPが望むものではありません。

+1

UNIQUEは、ファイルサイズにユニークな値が含まれている必要があることを意味します。インデックスを作成するのと同じではありません。 –

+0

@Enrico Detoma:SQLiteではなくMS SQLの場合はhttp://www.sqliteを読んでください。 org/faq.html#q26しかし、実際には行がそのテーブル内で一意の値を持つべきであることを意味しますが、これはテーブルがすでに主キーを持っているのでここでは妥当な制約のようです。 UNIQUEは最小限の変更で索引を作成します。 – kriss

+1

クリス、私はあなたがその点を逃したと思う。上の例では、一組の列を一意であると宣言していないので、ファイルサイズを一意にすると宣言します。実際には2つの異なるファイルが同じサイズを持つことができるので、本当に悪い考えです。これは、ユーザが望んでいたものではありません。 –

106

あなたが求めていることを正確に行うことはできませんが、一部のRDBMSと違って、SQLiteはトランザクション内でDDLを適切な結果で実行することができます。これはあなたがインデックスなしfile_hash_listを見て何について本当に心配している場合、あなたはあなたがそこに持っているものは何でもデータベースライブラリのトランザクションプリミティブを使用して

BEGIN; 
CREATE TABLE file_hash_list (
    id INTEGER PRIMARY KEY, 
    hash BLOB NOT NULL, 
    filesize INTEGER NOT NULL 
); 
CREATE INDEX file_hash_list_filesize_idx ON file_hash_list (filesize); 
COMMIT; 

または同等の操作を行うことができます。

どうすればいいのか分かりませんが、実際にはトランザクションの外で2つのコマンドを実行するのと比べてです。

他の人が指摘しているように、SQLiteのインデックスはすべてBツリーです。タイプが何であるか、または列のどの部分が索引付けされるかを選択することはできません。索引付けされた列全体が索引に含まれます。範囲問合せでも効率的ですが、実際に必要とするディスク容量よりもわずかなディスク容量を必要とするだけです。

+1

優れた答え。 –

+0

代わりに2つの別のクエリを使用するとどうなるでしょうか? – JeromeJ

+0

私は、一度にコミットされたすべてが普通ではないという意味ですか?もしそうでなければ、それが当てはまると、私はもうそれは問題ではないと思います。 – JeromeJ

関連する問題