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

sqlite

13546 просмотра

5 ответа

9547 Репутация автора

Я хочу узнать, с SQL-запросом, является ли индекс UNIQUE или нет. Я использую SQLite 3.

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

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

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

PRAGMA index_info(sqlite_autoindex_user_1);

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

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

Изменить: приведенный выше пример предназначен для автоматически сгенерированного индекса, но мой вопрос касается индексов в целом. Например, я могу создать индекс с «CREATE UNIQUE INDEX index1 ON visit (user, date)». Кажется, никакая команда SQL не покажет, будет ли мой новый индекс UNIQUE или нет.

Автор: Christian Davén Источник Размещён: 01.10.2008 12:42

Ответы (5)


2 плюса

2967 Репутация автора

вы можете программно построить инструкцию 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
)

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

Автор: dland Размещён: 01.10.2008 01:37

5 плюса

9547 Репутация автора

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

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

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

Автор: Christian Davén Размещён: 03.10.2008 07:11

1 плюс

11104 Репутация автора

Вы близки:

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

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

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

См. Документацию на сайте sqlite по Create Index

Автор: Noah Размещён: 19.01.2009 10:50

34 плюса

37908 Репутация автора

Решение
PRAGMA INDEX_LIST('table_name');

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

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

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

Автор: finnw Размещён: 21.09.2009 10:07

0 плюса

5502 Репутация автора

Начиная с sqlite 3.16.0 вы также можете использовать функции pragma:

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 не могут использовать эту функцию.

Автор: Mike Scotty Размещён: 05.12.2018 09:45
Вопросы из категории :
32x32