16

SQLiteデータベースが与えられた場合、特定のテーブルのどの列にインデックスが付けられているか、および並べ替え順序のリストを取得する必要があります。これはコードから実行する必要があります(C#、それは問題ではありません)。したがって、実際に必要なのは、SQLステートメントが存在する場合はそれを実行することです。

私はこれができることを知っています:

SELECT sql FROM SQLite_master WHERE type = 'index' AND tbl_name = 'MyTableName'

次に、結果のSQLを手動で解析しますが、これらの線に沿って何かを与えるクエリを実行できるメタデータがどこかにありますか?

------------------------------------
| 名前| 列| 方向|
 ------------------------------------
| idx_a | ColA | ASC |
 ------------------------------------
| idx_a_b | ColB、ColB | DESC |
 ------------------------------------
4

7 に答える 7

29

PRAGMA index_list(table-name);およびPRAGMA index_info(index-name); 拡張子を使用します。

更新:PRAGMA schema.index_xinfo(index-name);キー列の並べ替え順序を返します。

于 2012-11-17T00:21:06.483 に答える
12

where句に必要な条件を追加します。フィールドは次のとおりです。

CREATE TABLE sqlite_master (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);

貼り付け可能な選択...インデックスに含める重要なフィールドは「sql」です。createtableステートメントで定義された主キーは一覧表示されません。

select type, name, tbl_name, sql
FROM sqlite_master
WHERE type='index'
于 2017-01-19T20:57:54.610 に答える
2

それは文字通りあなたがそれを行う方法です:すべてのインデックスメタデータは'sqlite_master'テーブルを通して利用可能です。SQLite FAQのQ7を参照してください:http ://www.sqlite.org/faq.html#q7

于 2012-11-17T00:12:07.153 に答える
1

@neilは、SQLitePragmaステートメント PRAGMA INDEX_LIST['table_name']とを簡単に説明していますPRAGMA INDEX_INFO['index_name']。ドキュメントによると、これらはSQLiteコマンドとして存在するだけでなく、関数(つまりpragma_index_list(table_name)pragma_index_info(index_name)

これをよりよく理解するために、次のSQLを見てみましょう。

CREATE TABLE Assets
(
    Asset_Id     INTEGER NOT NULL,
    Longitude    REAL    NOT NULL,
    Latitude     REAL    NOT NULL,
    Name         TEXT    NOT NULL,
    Installation REAL    NOT NULL,
    Constraint PK_Assets PRIMARY KEY (Asset_Id)
);
CREATE INDEX IX_Assets_Coordinate On Assets (Longitude, Latitude);
CREATE INDEX IX_Assets_Name On Assets (Name);

次のSQLiteセッションは、インデックスをクエリする方法を示しています。

.mode csv
sqlite> PRAGMA index_list('Assets');
seq,name,unique
0,IX_Assets_Name,0
1,IX_Assets_Coordinate,0
sqlite> PRAGMA index_info('IX_Assets_Name');
seqno,cid,name
0,3,Name
sqlite> PRAGMA index_info('IX_Assets_Coordinate');
seqno,cid,name
0,1,Longitude
1,2,Latitude
sqlite>

興味深いのは、コマンドをステートメントのPRAGMAように使用できるSELECTため、でこれらのコマンドを実行しても問題がないことですC#

SQLiteプラグマステートメントには、すべてのテーブルのすべてのインデックス列を列挙するための興味深いサンプルSQLステートメントがあります。

SELECT DISTINCT m.name || '.' || ii.name AS 'indexed-columns'
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type = 'table'
 ORDER BY 1;
于 2018-03-16T00:03:54.300 に答える
1
SELECT 
    m.tbl_name as table_name,
    il.name as index_name,
    ii.name as column_name,
    CASE il.origin when 'pk' then 1 else 0 END as is_primary_key,
    CASE il.[unique] when 1 then 0 else 1 END as non_unique,
    il.[unique] as is_unique,
    il.partial,
    il.seq as sequence_in_index
FROM sqlite_master AS m,
    pragma_index_list(m.name) AS il,
    pragma_index_info(il.name) AS ii
WHERE 
    m.type = 'table'
    and m.tbl_name = 'YOUR TABLENAME HERE'
GROUP BY
    m.tbl_name,
    il.name,
    ii.name,
    il.origin,
    il.partial,
    il.seq
ORDER BY 1,6
于 2020-09-16T12:52:10.577 に答える
0

テーブルメタをクエリして必要なインドを取得する方法が見つからなかったので、誰かがそれを必要としている場合は、これが私が使用したものです。はい、正規表現はよりクリーンな仕事をしたかもしれませんが、あなたは格言を知っています、正規表現が問題を解決できるなら、今あなたは2つの問題を抱えています。

public class SqlIndexInfo
{
    public string IndexName { get; set; }
    public string TableName { get; set; }
    public string[] Fields { get; set; }
    public bool IsAscending { get; set; }

    public bool IsComposite
    {
        get { return Fields.Length > 1; }
    }
}

public static class Extensions
{
    public static SqlIndexInfo ParseToIndexInfo(this string sql)
    {
        sql = sql.Trim();
        var info = new SqlIndexInfo();

        var i = sql.IndexOf("CREATE INDEX", 0, StringComparison.InvariantCultureIgnoreCase);
        if (i < 0) throw new ArgumentException("String is not valid CREATE INDEX SQL");
        var indexNameStart = i + "CREATE INDEX".Length + 1;

        i = sql.IndexOf(" ON ", 0, StringComparison.InvariantCultureIgnoreCase);
        if (i < 0) throw new ArgumentException("String is not valid CREATE INDEX SQL");
        var indexNameEnd = i;
        var tableNameStart = i + " ON ".Length;

        i = sql.IndexOf("(", 0, StringComparison.InvariantCultureIgnoreCase);
        if (i < 0) throw new ArgumentException("String is not valid CREATE INDEX SQL");
        var tableNameEnd = i;
        var fieldNamesStart = i + 1;

        i = sql.IndexOf(")", 0, StringComparison.InvariantCultureIgnoreCase);
        if (i < 0) throw new ArgumentException("String is not valid CREATE INDEX SQL");
        var fieldNamesEnd = i;
        var directionStart = i + 1;

        // TODO: strip brackets and/or single quotes?

        info.IndexName = sql.Substring(indexNameStart, indexNameEnd - indexNameStart).Trim();
        info.TableName = sql.Substring(tableNameStart, tableNameEnd - tableNameStart).Trim();
        info.Fields = (from f in sql.Substring(fieldNamesStart, fieldNamesEnd - fieldNamesStart).Split(',')
                      where !string.IsNullOrEmpty(f)
                      select f.Trim()).ToArray();

        if (directionStart >= sql.Length)
        {
            info.IsAscending = true;
        }
        else
        {
            info.IsAscending = sql.IndexOf("ASC", directionStart, StringComparison.InvariantCultureIgnoreCase) >= 0;
        }

        return info;
    }
}
于 2012-11-17T17:33:02.593 に答える
0

@Steve Lloydの回答から最適化、注文ii.seqno

SELECT 
    m.tbl_name as table_name,
    il.name as index_name,
    ii.name as column_name,
    CASE il.origin when 'pk' then 1 else 0 END as is_primary_key,
    CASE il.[unique] when 1 then 0 else 1 END as non_unique,
    il.[unique] as is_unique,
    il.partial,
    il.seq as sequence_in_index,
    ii.seqno as sequence_in_column
FROM sqlite_master AS m,
    pragma_index_list(m.name) AS il,
    pragma_index_info(il.name) AS ii
WHERE 
    m.type = 'table'
    and m.tbl_name = 'YOUR TABLENAME HERE'
GROUP BY
    m.tbl_name,
    il.name,
    ii.name,
    il.origin,
    il.partial,
    il.seq
ORDER BY index_name,il.seq,ii.seqno
于 2021-02-15T07:33:31.710 に答える