Как узнать, уникален ли индекс SQLite? (С SQL) - PullRequest
17 голосов
/ 01 октября 2008

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

Я пробовал два подхода:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

Возвращает информацию об индексе («type», «name», «tbl_name», «rootpage» и «sql»). Обратите внимание, что столбец sql пуст, когда индекс автоматически создается SQLite.

PRAGMA index_info(sqlite_autoindex_user_1);

Возвращает столбцы в индексе ("seqno", "cid" и "name").

Любые другие предложения?

Редактировать: Приведенный выше пример предназначен для автоматически сгенерированного индекса, но мой вопрос касается индексов в целом. Например, я могу создать индекс с помощью «CREATE UNIQUE INDEX index1 ON посещение (пользователь, дата)». Кажется, никакая команда SQL не покажет, является ли мой новый индекс УНИКАЛЬНЫМ.

Ответы [ 5 ]

34 голосов
/ 21 сентября 2009
PRAGMA INDEX_LIST('table_name');

Возвращает таблицу с 3 столбцами:

  1. seq Уникальный числовой идентификатор индекса
  2. name Наименование индекса
  3. unique Флаг уникальности (ненулевой, если UNIQUE index.)

Затем просто перебирайте получающиеся строки, пока не увидите имя индекса, который вы хотите запросить (к сожалению, в выражении PRAGMA не может быть предложения WHERE.)

5 голосов
/ 03 октября 2008

Поскольку никто не дал хорошего ответа, я думаю, что лучшее решение это:

  • Если индекс начинается с "sqlite_autoindex", это автоматически сгенерированный индекс для одного столбца UNIQUE
  • В противном случае ищите ключевое слово UNIQUE в столбце sql таблицы sqlite_master, например:

    ВЫБРАТЬ * ИЗ sqlite_master ГДЕ type = 'index' И sql LIKE '% UNIQUE%'

2 голосов
/ 01 октября 2008

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

Вы рядом:

1) Если индекс начинается с "sqlite_autoindex", это автоматически сгенерированный индекс для первичного ключа. Однако это будет в таблицах sqlite_master или sqlite_temp_master в зависимости от того, является ли индексируемая таблица временной.

2) Вам нужно следить за именами таблиц и столбцов, которые содержат подстроку unique, поэтому вы хотите использовать:

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

См. Документацию веб-сайта sqlite по Создать индекс

0 голосов
/ 05 декабря 2018

Начиная с 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;

Приведенный выше оператор возвращает все таблицы и их столбцы, если столбец является частью уникального индекса.

Из документов :

Табличные функции для функции PRAGMA были добавлены в SQLite версии 3.16.0 (2017-01-02). Предыдущие версии SQLite не могли использовать эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...