18

SQLクエリを使用して、インデックスがUNIQUEであるかどうかを確認したいと思います。私はSQLite3を使用しています。

私は2つのアプローチを試しました:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

これにより、インデックスに関する情報( "type"、 "name"、 "tbl_name"、 "rootpage"、および "sql")が返されます。インデックスがSQLiteによって自動的に作成される場合、sql列は空であることに注意してください。

PRAGMA index_info(sqlite_autoindex_user_1);

これにより、インデックスの列( "seqno"、 "cid"、および "name")が返されます。

他に何か提案はありますか?

編集:上記の例は自動生成されたインデックス用ですが、私の質問は一般的なインデックスに関するものです。たとえば、「CREATE UNIQUE INDEX index1 ONvisit(user、date)」でインデックスを作成できます。新しいインデックスがUNIQUEであるかどうかをSQLコマンドで表示できないようです。

4

5 に答える 5

35
PRAGMA INDEX_LIST('table_name');

3 つの列を持つテーブルを返します。

  1. seqインデックスの一意の数値 ID
  2. nameインデックスの名前
  3. unique一意性フラグ (UNIQUEインデックスの場合はゼロ以外)

編集

JOINSQLite 3.16.0 以降では、特定のテーブルと列を検索できるという利点があるテーブル値プラグマ関数も使用できます。@mike-scotty の回答を参照してください。

于 2009-09-21T10:07:43.217 に答える
5

誰も良い答えを思い付いていないので、最善の解決策はこれだと思います:

  • インデックスが「sqlite_autoindex」で始まる場合、それは単一の UNIQUE 列に対して自動生成されたインデックスです
  • それ以外の場合は、次のように、テーブル sqlite_master の sql 列で UNIQUE キーワードを探します。

    SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE '%UNIQUE%'

于 2008-10-03T07:11:49.790 に答える
2

プログラムで select ステートメントを作成して、タプルが複数の行を指しているかどうかを確認できます。foo、bar、baz の 3 つの列が返された場合は、次のクエリを作成します。

select count(*) from t
group by foo, bar, baz
having count(*) > 1

それが行を返す場合、指定されたタプルに複数の行がマップされるため、インデックスは一意ではありません。sqlite3 が派生テーブルをサポートしている場合 (私はまだその必要性を持っていないので、すぐにはわかりません)、これをさらに簡潔にすることができます。

select count(*) from (
    select count(*) from t
    group by foo, bar, baz
    having count(*) > 1
)

これにより、重複するタプル セットの数を示す単一行の結果セットが返されます。正の場合、インデックスは一意ではありません。

于 2008-10-01T13:37:19.303 に答える
1

あなたは近くにいます:

1) インデックスが で始まる場合"sqlite_autoindex"、主キー の自動生成インデックスです。ただし、これは、インデックスが作成されたテーブルが一時的なものかどうかに応じて、sqlite_masterまたはテーブルになります。sqlite_temp_master

2)部分文字列を含むテーブル名と列に注意する必要があるuniqueため、次を使用します。

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'

Create Indexに関する sqlite Web サイトのドキュメントを参照してください。

于 2009-01-19T22:50:30.913 に答える