Мне нужно было сделать это через пару раз, поэтому я делюсь своим Q/A.
Как проверить, существует ли индекс в поле таблицы в MySQL?
Ответ 1
Используйте SHOW INDEX
следующим образом:
SHOW INDEX FROM [tablename]
Документы: https://dev.mysql.com/doc/refman/5.0/en/show-index.html
Ответ 2
Try:
SELECT * FROM information_schema.statistics
WHERE table_schema = [DATABASE NAME]
AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]
Он скажет вам, есть ли какой-либо индекс в определенном столбце без необходимости знать имя, указанное индексу. Он также будет работать в хранимой процедуре (в отличие от показа индекса)
Ответ 3
SHOW KEYS FROM tablename WHERE Key_name='unique key name'
вы можете найти, существует ли в таблице уникальный ключ
Ответ 4
show index from table_name where Column_name='column_name';
Ответ 5
Используйте следующий оператор: SHOW INDEX FROM your_table
И затем проверьте результат для полей: row [ "Table" ], row [ "Key_name" ]
Убедитесь, что вы правильно пишете "Key_name"
Ответ 6
чтобы просто взглянуть на макет таблиц из cli. вы бы сделали
desc mytable
или
показать таблицу mytable
Ответ 7
Если вам нужна функциональность, если существует индекс для столбца (здесь по порядку первое место) в качестве функции базы данных, вы можете использовать/принять этот код. Если вы хотите проверить, существует ли индекс вообще, независимо от позиции в индексе с несколькими столбцами, просто удалите часть "AND SEQ_IN_INDEX = 1".
DELIMITER $$
CREATE FUNCTION 'fct_check_if_index_for_column_exists_at_first_place'(
'IN_SCHEMA' VARCHAR(255),
'IN_TABLE' VARCHAR(255),
'IN_COLUMN' VARCHAR(255)
)
RETURNS tinyint(4)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
BEGIN
-- Check if index exists at first place in sequence for a given column in a given table in a given schema.
-- Returns -1 if schema does not exist.
-- Returns -2 if table does not exist.
-- Returns -3 if column does not exist.
-- If the index exists in first place it returns 1, otherwise 0.
-- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');
-- check if schema exists
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
INFORMATION_SCHEMA.SCHEMATA
WHERE
SCHEMA_NAME = IN_SCHEMA
;
IF @COUNT_EXISTS = 0 THEN
RETURN -1;
END IF;
-- check if table exists
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
;
IF @COUNT_EXISTS = 0 THEN
RETURN -2;
END IF;
-- check if column exists
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
AND COLUMN_NAME = IN_COLUMN
;
IF @COUNT_EXISTS = 0 THEN
RETURN -3;
END IF;
-- check if index exists at first place in sequence
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
information_schema.statistics
WHERE
TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
AND SEQ_IN_INDEX = 1;
IF @COUNT_EXISTS > 0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;
Ответ 8
вы можете использовать следующую инструкцию 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
Ответ 9
Вы не можете запустить определенный индексный индексный запрос, потому что он будет вызывать ошибку, если индекс не существует. Таким образом, вы должны захватить все индексы в массив и пропустить их, если вы хотите избежать любых ошибок 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
, чтобы увидеть, с чем вы можете работать.