Получить в MySQL имя поля содержащего в себе первичный ключ

Для одного из проектов понадобилось узнать имя поля у таблицы содержащего в себе первичный ключ. Погуглив ничего путного не нашел, ответ нарыл случайно в 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';

При желании имя БД можно опустить, но это чревато тем, что можно получить несколько результатов, если есть таблицы с одинаковым именем в разных БД.

UPD:
Спасибо Максиму, решение намного проще и изящнее.

SHOW COLUMNS FROM `table` WHERE `key`=’pri’;

7 thoughts on “Получить в MySQL имя поля содержащего в себе первичный ключ

  1. Привет! Не покатит для старых БД, где не было информационной таблицы. Да и сам запрос пипец, объединять 2 таблицы… сложно.

    Вот решение от меня SHOW COLUMNS FROM `table` WHERE `key`=’pri’;

    Меняй только название таблицы остальное не трогай.

  2. Вот мне вообще интересно об information_schema, можно и детальный обзорчик написать на эту тему

  3. В MySQL 3.23/4.0/4.1 для SHOW COLUMNS поле WHERE использовать нельзя.
    Только LIKE:
    SHOW [FULL] COLUMNS {FROM | IN} tbl_name [{FROM | IN} db_name] [LIKE ‘pattern’]

    • Хм в старых версиях не тестировал, везде 5-ка стоит, спасибо за коммент, столкнусь со старой версией буду знать как фиксить 🙂

  4. а как вытащить список всех полей всех таблиц в базе по заданному паттерну?

  5. Если я вас правильно понял, то можно это сделать вот таким запросом к системной бд information_schema

    SELECT column_name
    FROM information_schema.columns
    WHERE column_name LIKE 's%';

Comments are closed.