Вопросы | sqlite

Как узнать, уникален ли индекс SQLite? (С SQL)

Вопрос

Christian Davén | 13532 просмотров | рейтинг: 1

Я хочу узнать с помощью SQL-запроса, является ли индекс УНИКАЛЬНЫМ или нет. Я использую SQLite 3. Я попробовал два подхода:

 SELECT * FROM sqlite_master WHERE name = sqlite_autoindex_user_1
 
Это возвращает информацию об индексе (тип, имя, tbl_name, rootpage и sql). Обратите внимание, что столбец sql пуст, когда индекс автоматически создается SQLite.
 PRAGMA index_info(sqlite_autoindex_user_1);
 
Это возвращает столбцы в индексе (seqno, cid и name). Любые другие предложения? Изменить: приведенный выше пример для автоматически сгенерированного индекса, но мой вопрос об индексах в целом. Например, я могу создать индекс с помощью CREATE UNIQUE INDEX index1 ON посещение (пользователь, дата). Кажется, никакая команда SQL не покажет, является ли мой новый индекс УНИКАЛЬНЫМ или нет.

Комментарии:

finnw

Можете ли вы привести пример, когда автоматически сгенерированный индекс не является уникальным? Те, которые я видел, всегда были уникальными.


Noah

autoindex генерируется для первичного ключа, который по определению уникален




Ответы

Noah

+ 2 -
Вы можете программно построить оператор выбора, чтобы увидеть, указывают ли какие-либо кортежи на более чем одну строку. Если вы получите три столбца, 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
)
 

Это вернет набор результатов из одной строки, обозначающий количество повторяющихся наборов кортежей. Если положительный, ваш индекс не является уникальным.  


Christian Davén

+ 5 -
Так как никто не может дать хороший ответ, я думаю, что лучшее решение это: Если индекс начинается с sqlite_autoindex, это автоматически сгенерированный индекс для одного столбца UNIQUE В противном случае ищите ключевое слово UNIQUE в столбце sql таблицы sqlite_master, например: SELECT * FROM sqlite_master WHERE type = 'index' И sql LIKE '% UNIQUE%'  


dland

+ 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