如何确定SQLite索引是否唯一?(使用SQL)
我想通过SQL查询了解索引是否唯一。我正在使用SQLite 3 我尝试了两种方法:如何确定SQLite索引是否唯一?(使用SQL),sqlite,Sqlite,我想通过SQL查询了解索引是否唯一。我正在使用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); 这将返回索引中的列(“seq
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”)
还有其他建议吗
编辑:上面的例子是针对自动生成的索引,但我的问题是关于一般索引的。例如,我可以使用“在访问时创建唯一索引index1(用户,日期)”创建索引。似乎没有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”开头,则它是为单个唯一列自动生成的索引
- 否则,请在表sqlite_master的sql列中查找UNIQUE关键字,如下所示: 从sqlite_master中选择*,其中type='index'和类似于“%UNIQUE%”的sql
”sqlite\u autoindex“
开头,则它是主键的自动生成索引。但是,这将出现在sqlite\u master
或sqlite\u temp\u master
表中,具体取决于被索引的表是否为临时表
2) 您需要注意包含子字符串unique
的表名和列,因此要使用:
SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'
请参阅上的sqlite网站文档
返回包含3列的表:
seq
索引的唯一数字ID名称
索引的名称唯一性
唯一性标志(如果唯一性
索引,则非零。)自SQLite 3.16.0以来,您还可以使用表值pragma函数,其优点是您可以
连接它们来搜索特定的表和列。请参阅。从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的早期版本无法使用此功能
你能举一个自动生成的索引不是唯一的例子吗?我看到的那些总是唯一的。自动索引是为主键生成的,根据定义,主键是唯一的。当然,这仍然不会告诉您索引是否允许重复,但碰巧还没有。第一点不太正确。如果索引以“sqlite_autoindex”开头,则它是主键的自动生成索引。但是如果PK是多个列,那么“单个唯一列”就不是真的。我前面有一个是复合PK,即两列在一起是唯一的(但单独不是)。
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;