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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
109
0
101 536
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Используйте SHOW INDEX так:

SHOW INDEX FROM [tablename]

Документы: https://dev.mysql.com/doc/refman/5.0/en/show-index.html

ПОКАЗАТЬ ИНДЕКС ОТ my_table, ГДЕ Key_name = 'index_to_check';

mit 13.11.2010 05:58

Лучше использовать Column_name вместо Key_name, так вам не нужно будет узнавать имя индекса, если он автоматически добавляется без имени.

Programista 09.04.2014 15:05

Как проверить несколько ключей?

berserk 10.11.2014 07:54

Будьте осторожны и проверьте все утверждения, используя это. Это не удается для некоторых таблиц в моей базе данных при попытке использовать его с LiquiBase 1.9.5. Возможно, моя БД повреждена. Или, может быть, это ошибка в старой версии LiquiBase, которую я использую на работе.

Steve Gelman 22.06.2017 01:05

просто посмотреть на макет таблиц из cli. ты бы сделал

desc mytable

или же

show table mytable

Пытаться:

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';

Вы не можете запустить конкретный запрос индекса шоу, потому что он выдаст ошибку, если индекс не существует. Следовательно, вы должны захватить все индексы в массив и перебрать их, если вы хотите избежать ошибок 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, чтобы увидеть, с чем вы можете работать.

вы можете использовать следующий оператор 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 FROM your_table

А затем проверьте результат по полям: row ["Table"], row ["Key_name"]

Убедитесь, что вы правильно написали "Key_name"

Если вам нужна функциональность, если индекс для столбца существует (здесь на первом месте по порядку) в качестве функции базы данных, вы можете использовать / принять этот код. Если вы хотите проверить, существует ли индекс вообще, независимо от позиции в многоколоночном индексе, просто удалите часть «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 ;

Попробуйте использовать это:

SELECT TRUE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "{DB_NAME}" 
AND TABLE_NAME = "{DB_TABLE}"
AND COLUMN_NAME = "{DB_INDEXED_FIELD}";

Добавляем к тому, что предлагал GK10:

Use the following statement: SHOW INDEX FROM your_table

And then check the result for the fields: row["Table"], row["Key_name"]

Make sure you write "Key_name" correctly

Можно взять это и использовать в PHP (или другом языке), обернутом вокруг оператора sql, чтобы найти столбцы индекса. Обычно вы можете вывести результат SHOW INDEX FROM mytable в PHP, а затем использовать столбец Column_name для получения столбца индекса.

Создайте строку подключения к базе данных и сделайте что-то вроде этого:

$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$sql =  "SHOW INDEX FROM 'mydatabase.mytable' WHERE Key_name = 'PRIMARY';" ;
$result = mysqli_query($mysqli, $sql);

while ($row = $result->fetch_assoc()) {
    echo $rowVerbatimsSet["Column_name"];
}

Другие вопросы по теме