【问题标题】:How do I find out if a SQLite index is unique? (With SQL)如何确定 SQLite 索引是否唯一? (使用 SQL)
【发布时间】:2010-09-14 12:25:07
【问题描述】:

我想通过 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 命令会显示我的新索引是否为 UNIQUE。

【问题讨论】:

  • 你能举一个自动生成的索引不是唯一的例子吗?我见过的总是独一无二的。
  • 自动索引是为主键生成的,根据定义是唯一的

标签: sqlite


【解决方案1】:
PRAGMA INDEX_LIST('table_name');

返回一个包含 3 列的表格:

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

编辑

从 SQLite 3.16.0 开始,您还可以使用表值杂注函数,其优点是您可以JOIN 它们来搜索特定的表和列。见@mike-scotty's answer

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 第一点不太对。如果索引以“sqlite_autoindex”开头,则它是主键的自动生成索引。但是如果 PK 是多列,那么“单 UNIQUE 列”就不成立。我面前有一个复合 PK,即两列一起是唯一的(但单独不是)。
    【解决方案3】:

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

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

    【讨论】:

    • 当然,这仍然不会告诉您索引是否允许重复,但碰巧还没有。
    【解决方案4】:

    你很接近:

    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 网站文档

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-25
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多