如何确定SQLite索引是否唯一? (使用SQL)
时间:2020-03-06 14:58:26 来源:igfitidea点击:
我想用SQL查询找出索引是否为UNIQUE。我正在使用SQLite 3.
我尝试了两种方法:
SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'
这将返回有关索引的信息("类型","名称"," tbl_name"," rootpage"和" sql")。请注意,当SQLite自动创建索引时,sql列为空。
PRAGMA index_info(sqlite_autoindex_user_1);
这将返回索引中的列(" seqno"," cid"和" name")。
还有其他建议吗?
编辑:上面的示例是为自动生成的索引,但我的问题是关于索引的一般情况。例如,我可以使用"在访问(用户,日期)时创建唯一索引index1"来创建索引。看来我的新索引是否为UNIQUE不会显示任何SQL命令。
解决方案
我们可以以编程方式构建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 )
这将返回单行结果集,表示重复的元组集的数量。如果为正,则索引不是唯一的。
既然没有人提出一个好的答案,我认为最好的解决方案是这样的:
- 如果索引以" sqlite_autoindex"开头,则它是单个UNIQUE列的自动生成的索引
- 否则,在表sqlite_master的sql列中查找UNIQUE关键字,如下所示:SELECT * FROM sqlite_master WHERE type ='index'AND sql LIKE'%UNIQUE%'
我们很接近:
1)如果索引以" sqlite_autoindex"开头,则它是主键自动生成的索引。但是,这将在" sqlite_master"或者" sqlite_temp_master"表中,具体取决于要建立索引的表是临时表。
2)我们需要当心包含子字符串" unique"的表名和列,因此要使用:
SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'
请参阅有关创建索引的sqlite网站文档
PRAGMA INDEX_LIST('table_name');
返回具有3列的表:
seq
索引的唯一数字IDname
索引名称unique
唯一性标志(如果UNIQUE
索引为非零。)
然后循环遍历结果行,直到看到要查询的索引名称(不幸的是,PRAGMA语句中不能有WHERE子句。)