2008-10-01 104 views
15

我想用SQL查詢找出索引是否爲UNIQUE。我使用SQLite 3如何找出SQLite索引是否唯一? (使用SQL)

我已經嘗試了兩種方法:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1' 

這將返回有關指數( 「類型」 信息, 「名字」, 「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或不。

+0

您可以舉例說明自動生成的索引不唯一嗎?我見過的人一直都是獨一無二的。 – finnw 2008-10-02 17:05:53

+0

autoindex是爲主鍵生成的,它的定義是唯一的 – Noah 2009-01-19 22:52:24

回答

31
PRAGMA INDEX_LIST('table_name'); 

返回SQLite的網站文件與3列的表格:

  1. seq Uniqu指數電子數字ID
  2. name索引的名稱
  3. unique唯一標誌(非零如果UNIQUE指數。)

然後,只需通過所產生的行中循環,直到你看到你想索引的名字查詢(遺憾的是,在PRAGMA聲明中不能有WHERE子句。)

1

您可以通過編程方式構建一個select語句來查看是否有任何元組指向多個行。如果你獲得了三列,富,酒吧和巴茲,創建以下查詢

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 
) 

這將返回一個單行結果集,表示重複的元組集的數量。如果是肯定的,你的索引不是唯一的。

+0

是的,它在sqlite3中有效。 – finnw 2008-10-02 16:55:37

+2

當然,這仍然不會告訴你索引是否允許重複,但是現在還沒有發生。 – finnw 2008-10-02 17:10:43

5

因爲沒有人的拿出一個很好的答案,我認爲最好的辦法是這樣的:

  • 如果該指數以「sqlite_autoindex」開始,這是一個唯一的列設置爲自動生成的索引
  • 否則,請在表格中SQLITE_MASTER的SQL列UNIQUE關鍵字,像這樣的東西:

    SELECT * FROM SQLITE_MASTER其中type = '指數' 和SQL LIKE '%UNIQUE%'

1

你接近:

1)如果該指數與"sqlite_autoindex"啓動時,它是主鍵自動生成的索引。但是,這將在sqlite_mastersqlite_temp_master表中,具體取決於被索引的表是否是臨時表。

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

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

查看​​