Как проверить, существует ли индекс в поле таблицы в MySQL?
Мне нужно было погуглить это пару раз, поэтому я делюсь своим Q/A.
8 ответов:
использовать
SHOW INDEX
вот так:SHOW INDEX FROM [tablename]
Docs:https://dev.mysql.com/doc/refman/5.0/en/show-index.html
попробуй:
SELECT * FROM information_schema.statistics WHERE table_schema = [DATABASE NAME] AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]
Он скажет вам, если есть индекс на колонку, не нужно знать название индекса. Он также будет работать в хранимой процедуре (в отличие от show index)
SHOW KEYS FROM tablename WHERE Key_name='unique key name'
вы можете найти, если существует уникальный ключ в таблице
чтобы просто посмотреть на макет таблиц из cli. вы бы сделали
desc mytable
или
показать таблицу mytable
используйте следующую инструкцию: показать индекс от your_table
а затем проверьте результат для полей: row ["Table"], row ["Key_name"]
убедитесь, что вы пишете "Key_name" правильно
вы можете использовать следующую инструкцию SQL, чтобы проверить, что данный столбец в таблице был проиндексирован или нет
select a.table_schema, a.table_name, a.column_name, index_name from information_schema.columns a join information_schema.tables b on a.table_schema = b.table_schema and a.table_name = b.table_name and b.table_type = 'BASE TABLE' left join ( select concat(x.name, '/', y.name) full_path_schema, y.name index_name FROM information_schema.INNODB_SYS_TABLES as x JOIN information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID WHERE x.name = 'your_schema' and y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema where a.table_schema = 'your_schema' and a.column_name = 'your_column' order by a.table_schema, a.table_name;
так как соединения против INNODB_SYS_*, поэтому индексы соответствия только пришли из таблиц INNODB только
вы не можете запустить конкретный запрос show index, потому что он вызовет ошибку, если индекс не существует. Таким образом, вы должны захватить все индексы в массив и цикл через них, если вы хотите избежать каких-либо ошибок SQL.
вот как я это делаю. Я беру все индексы из таблицы (в данном случае,
leads
) и затем, в цикле foreach, проверьте, если имя столбца (в этом случае,province
) существует или нет.$this->name = 'province'; $stm = $this->db->prepare('show index from `leads`'); $stm->execute(); $res = $stm->fetchAll(); $index_exists = false; foreach ($res as $r) { if ($r['Column_name'] == $this->name) { $index_exists = true; } }
таким образом, вы можете очень сузить индекс атрибуты. Сделай
print_r
на$res
для того, чтобы увидеть, что вы можете работать.