给定一个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 | ------------------------------------
在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)
我找不到任何方法来简单地查询表元并获取我想要的 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)
| 归档时间: |
|
| 查看次数: |
8691 次 |
| 最近记录: |