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

sqlite

13546 观看

5回复

9547 作者的声誉

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

作者: Christian Davén 的来源 发布者: 2008 年 10 月 1 日

回应 5


2

2967 作者的声誉

您可以以编程方式构建一个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
)

这将返回单行结果集,表示重复元组集的数量。如果为正,则您的索引不是唯一的。

作者: dland 发布者: 2008 年 10 月 1 日

5

9547 作者的声誉

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

  • 如果索引以“sqlite_autoindex”开头,则它是单个UNIQUE列的自动生成索引
  • 否则,在表sqlite_master的sql列中查找UNIQUE关键字,如下所示:

    SELECT * FROM sqlite_master WHERE type ='index'AND sql LIKE'%UNIQUE%'

作者: Christian Davén 发布者: 2008 年 10 月 3 日

1

11104 作者的声誉

你很近:

1)如果索引以...开头"sqlite_autoindex",则它是主键的自动生成索引。但是,根据被索引的表是否是临时表,这将取决于sqlite_mastersqlite_temp_master表。

2)您需要注意包含子字符串的表名和列unique,因此您要使用:

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'

请参阅有关创建索引的sqlite网站文档

作者: Noah 发布者: 2009 年 1 月 19 日

34

37908 作者的声誉

决定
PRAGMA INDEX_LIST('table_name');

返回一个包含3列的表:

  1. seq 索引的唯一数字ID
  2. name 索引的名称
  3. unique唯一性标志(如果是UNIQUE索引,则为非零)。

然后循环遍历生成的行,直到您看到要查询的索引的名称(遗憾的是,您不能WHEREPRAGMA语句中包含子句。)

作者: finnw 发布者: 2009 年 9 月 21 日

0

5502 作者的声誉

从sqlite 3.16.0开始,你也可以使用pragma函数:

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的早期版本无法使用此功能。

作者: Mike Scotty 发布者: 2018 年 12 月 5 日
32x32