18

我想通过 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);

这将返回索引中的列(“seqno”、“cid”和“name”)。

还有其他建议吗?

编辑:上面的例子是一个自动生成的索引,但我的问题是关于索引的。例如,我可以使用“CREATE UNIQUE INDEX index1 ON visit (user, date)”创建一个索引。似乎没有 SQL 命令会显示我的新索引是否是唯一的。

4

5 回答 5

35
PRAGMA INDEX_LIST('table_name');

返回一个包含 3 列的表:

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

编辑

从 SQLite 3.16.0 开始,您还可以使用表值杂注函数,其优点是您可以JOIN搜索特定的表和列。请参阅@mike-scotty 的回答

于 2009-09-21T10:07:43.217 回答
5

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

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

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

于 2008-10-03T07:11:49.790 回答
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
)

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

于 2008-10-01T13:37:19.303 回答
1

你很接近:

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

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

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

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

于 2009-01-19T22:50:30.913 回答
1

从 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;

如果列是唯一索引的一部分,上述语句将返回所有表及其列。

文档

在 SQLite 版本 3.16.0 (2017-01-02) 中添加了 PRAGMA 功能的表值函数。SQLite 的早期版本无法使用此功能。

于 2018-12-05T09:45:05.077 回答