如何获取给定表的索引列的列表

cta*_*cke 9 c# sqlite

给定一个SQLite数据库,我需要获取一个列表,列出给定表中的哪些列被索引,以及排序顺序.我需要从代码中执行此操作(C#,尽管这不重要),所以我真正需要的是一个SQL语句,如果存在,则执行此操作.

我知道我可以这样做:

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

然后手动解析生成的SQL,但是在某个地方有一些我可以查询的元数据会给我一些东西吗?

 ------------------------------------
|   name    | column     | direction |
 ------------------------------------
| idx_a     | ColA       | ASC       |
 ------------------------------------
| idx_a_b   | ColB, ColB | DESC      |
 ------------------------------------

Nei*_*eil 14

使用PRAGMA index_list(table-name);PRAGMA index_info(index-name); 扩展名.


Joh*_*ard 8

在where子句中添加所需的任何条件.领域是:

CREATE TABLE sqlite_master (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);
Run Code Online (Sandbox Code Playgroud)

可选择的选择...索引包含的重要字段是"sql".不会列出create table statment中定义的主键.

select type, name, tbl_name, sql
FROM sqlite_master
WHERE type='index'
Run Code Online (Sandbox Code Playgroud)


cta*_*cke 0

我找不到任何方法来简单地查询表元并获取我想要的 indo,所以如果有人需要它,这就是我使用的方法。是的,Regex 可能做得更干净,但你知道这句格言,如果 Regex 可以解决问题,那么现在你有两个问题。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)