Ответ 1
Используйте SHOW INDEX
следующим образом:
SHOW INDEX FROM [tablename]
Документы: https://dev.mysql.com/doc/refman/5.0/en/show-index.html
Мне нужно было сделать это через пару раз, поэтому я делюсь своим Q/A.
Используйте SHOW INDEX
следующим образом:
SHOW INDEX FROM [tablename]
Документы: https://dev.mysql.com/doc/refman/5.0/en/show-index.html
Try:
SELECT * FROM information_schema.statistics
WHERE table_schema = [DATABASE NAME]
AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]
Он скажет вам, есть ли какой-либо индекс в определенном столбце без необходимости знать имя, указанное индексу. Он также будет работать в хранимой процедуре (в отличие от показа индекса)
SHOW KEYS FROM tablename WHERE Key_name='unique key name'
вы можете найти, существует ли в таблице уникальный ключ
show index from table_name where Column_name='column_name';
Используйте следующий оператор: SHOW INDEX FROM your_table
И затем проверьте результат для полей: row [ "Table" ], row [ "Key_name" ]
Убедитесь, что вы правильно пишете "Key_name"
чтобы просто взглянуть на макет таблиц из cli. вы бы сделали
desc mytable
или
показать таблицу mytable
Если вам нужна функциональность, если существует индекс для столбца (здесь по порядку первое место) в качестве функции базы данных, вы можете использовать/принять этот код. Если вы хотите проверить, существует ли индекс вообще, независимо от позиции в индексе с несколькими столбцами, просто удалите часть "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 ;
вы можете использовать следующую инструкцию 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
Вы не можете запустить определенный индексный индексный запрос, потому что он будет вызывать ошибку, если индекс не существует. Таким образом, вы должны захватить все индексы в массив и пропустить их, если вы хотите избежать любых ошибок 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
, чтобы увидеть, с чем вы можете работать.