Как проверить, существует ли индекс в поле таблицы в MySQL?


Мне нужно было погуглить это пару раз, поэтому я делюсь своим Q/A.

8 91

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'

вы можете найти, если существует уникальный ключ в таблице

show index from table_name where Column_name='column_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 для того, чтобы увидеть, что вы можете работать.