如何确定SQLite索引是否唯一? (使用SQL)

时间:2008-10-01 12:42:10

标签: sqlite

我想通过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命令显示。

5 个答案:

答案 0 :(得分:34)

PRAGMA INDEX_LIST('table_name');

返回一个包含3列的表:

  1. seq索引的唯一数字ID
  2. name索引名称
  3. unique唯一性标记(如果UNIQUE索引则为非零。)
  4. 然后只循环生成的行,直到您看到要查询的索引的名称(遗憾的是,您在WHERE语句中不能有PRAGMA子句。)

答案 1 :(得分:5)

由于没有人得到一个好的答案,我认为最好的解决方案是:

  • 如果索引以“sqlite_autoindex”开头,则它是单个UNIQUE列的自动生成索引
  • 否则,请在表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_mastersqlite_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不能使用此功能。