Из архива блога, 2010 год. Восстановлено 22 сентября 2026 года. Исправлен короткий запрос и добавлено пояснение для составного ключа. Имена db и tbl замените на свою базу и таблицу.
Для одного из проектов понадобилось узнать имя поля у таблицы содержащего в себе первичный ключ. Погуглив ничего путного не нашел, ответ нарыл случайно в lists на официальном сайте. Запрос оказался очень интересным, оказывается выборку надо производить из вспомогательных полей самого MySQL.
Запрос для базы с именем db, и таблицы с именем tbl.
SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
AND t.table_schema='db'
AND t.table_name='tbl'
ORDER BY k.ordinal_position;
При желании имя БД можно опустить, но это чревато тем, что можно получить несколько результатов, если есть таблицы с одинаковым именем в разных БД.
UPD: Спасибо Максиму, решение намного проще и изящнее.
SHOW INDEX FROM `tbl` FROM `db` WHERE Key_name = 'PRIMARY';
Если первичный ключ составной
Результат содержит несколько строк — по одной на колонку ключа. В первом запросе ORDER BY k.ordinal_position сохраняет порядок колонок в ограничении. В SHOW INDEX этот порядок указан в Seq_in_index, имя колонки — в Column_name. У таблицы без первичного ключа эти запросы не возвращают строк. Уникальный индекс не обязательно является PRIMARY KEY.
Документация: MySQL SHOW INDEX. Еще один пример: копирование строк между таблицами.