我想通过SQL查询找出索引是否为UNIQUE。我正在使用SQLite 3。
我尝试了两种方法:
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 ON visit(user,date)”创建索引。如果我的新索引是UNIQUE,似乎没有SQL命令显示。
答案 0 :(得分:34)
PRAGMA INDEX_LIST('table_name');
返回一个包含3列的表:
seq
索引的唯一数字ID name
索引名称unique
唯一性标记(如果UNIQUE
索引则为非零。)然后只循环生成的行,直到您看到要查询的索引的名称(遗憾的是,您在WHERE
语句中不能有PRAGMA
子句。)
答案 1 :(得分:5)
由于没有人得到一个好的答案,我认为最好的解决方案是:
否则,请在表sqlite_master的sql列中查找UNIQUE关键字,如下所示:
SELECT * FROM sqlite_master WHERE type ='index'AND sql LIKE'%UNIQUE%'
答案 2 :(得分:2)
您可以以编程方式构建一个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
)
这将返回单行结果集,表示重复元组集的数量。如果为正,则您的索引不是唯一的。
答案 3 :(得分: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网站文档答案 4 :(得分:0)
从sqlite 3.16.0开始,您还可以使用编译指示功能:
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;
如果列是唯一索引的一部分,则以上语句将返回所有表及其列。
来自docs:
SQLite 3.16.0(2017-01-02)中添加了PRAGMA功能的表值函数。早期版本的SQLite不能使用此功能。