我想找到出,与SQL查询,无论是一个指标是唯一的或没有。我使用源码3.

我们试两种方法:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

这个回返信息有关的指数("类型"、"name","tbl_name","rootpage"和"sql").注意sql栏是空的,当索引是自动建立由源码.

PRAGMA index_info(sqlite_autoindex_user_1);

这种返回所列索引("seqno","cid"和"名称").

任何其他建议吗?

编辑: 上述例子是用于自动生成的指标,但是我的问题是有关索引的一般。例如,我可以建立一个索引用"创建独特的索引索引1月访问(用户的日期)".它似乎没有命令将显示,如果我的新的索引是独特或没有。

有帮助吗?

解决方案

PRAGMA INDEX_LIST('table_name');

返回一个包含3列的表:

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

其他提示

由于没有人来了一个很好的答案,我认为最好的解决方案是这样的:

  • 如果该索引的开始"sqlite_autoindex",这是一个自动生成指数的一个单独列
  • 否则,寻找唯一的关键在sql列在表sqlite_master,事情是这样的:

    SELECT*from sqlite_master其中type='index'和sql LIKE'%的独特%'

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

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

你很近:

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top