题
我想找到出,与SQL查询,无论是一个指标是唯一的或没有。我使用源码3.
我们试两种方法:
SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'
这个回返信息有关的指数("类型"、"name","tbl_name","rootpage"和"sql").注意sql栏是空的,当索引是自动建立由源码.
PRAGMA index_info(sqlite_autoindex_user_1);
这种返回所列索引("seqno","cid"和"名称").
任何其他建议吗?
编辑: 上述例子是用于自动生成的指标,但是我的问题是有关索引的一般。例如,我可以建立一个索引用"创建独特的索引索引1月访问(用户的日期)".它似乎没有命令将显示,如果我的新的索引是独特或没有。
解决方案
PRAGMA INDEX_LIST('table_name');
返回一个包含3列的表:
-
seq
索引的唯一数字ID -
name
索引名称 -
unique
唯一性标志(如果UNIQUE
索引,则为非零。)
醇>
然后只循环生成的行,直到看到要查询的索引的名称(遗憾的是,在 PRAGMA
语句中不能有 WHERE
子句。)
其他提示
由于没有人来了一个很好的答案,我认为最好的解决方案是这样的:
- 如果该索引的开始"sqlite_autoindex",这是一个自动生成指数的一个单独列
否则,寻找唯一的关键在sql列在表sqlite_master,事情是这样的:
SELECT*from sqlite_master其中type='index'和sql LIKE'%的独特%'
您可以以编程方式构建一个select语句,以查看是否有任何元组指向多行。如果您返回三列,foo,bar和baz,请创建以下查询
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
)
这将返回单行结果集,表示重复元组集的数量。如果为正,则您的索引不是唯一的。
你很近:
1)如果索引以" sqlite_autoindex"
开头,则它是主键的自动生成索引。但是,这将在 sqlite_master
或 sqlite_temp_master
表中,具体取决于被索引的表是否是临时表。
2)您需要注意包含子串 unique
的表名和列,因此您要使用:
SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'
请参阅有关创建索引的sqlite网站文档
从sqlite 3.16.0开始,你也可以使用pragma函数:
SELECT distinct il.name
FROM sqlite_master AS m,
pragma_index_list(m.name) AS il,
pragma_index_info(il.name) AS ii
WHERE m.type='table' AND il.[unique] = 1;
上述语句将列出唯一索引的所有名称。
SELECT DISTINCT m.name as table_name, ii.name as column_name
FROM sqlite_master AS m,
pragma_index_list(m.name) AS il,
pragma_index_info(il.name) AS ii
WHERE m.type='table' AND il.[unique] = 1;
如果列是唯一索引的一部分,则上述语句将返回所有表及其列。
来自文档:
在SQLite 3.16.0版(2017-01-02)中添加了PRAGMA功能的表值函数。 SQLite的早期版本无法使用此功能。