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

如何确定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

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

还有其他建议吗


编辑:上面的例子是针对自动生成的索引,但我的问题是关于一般索引的。例如,我可以使用“在访问时创建唯一索引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

您很接近:

1) 如果索引以“
”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;