Подтвердить что ты не робот

MySQL: определение основного ключа таблицы динамически

Я создаю SQL-запрос, подобный этому в PHP:

$sql = sprintf("UPDATE %s SET %s = %s WHERE %s = %s", ...);

Поскольку почти каждая часть этого запроса является динамической, мне нужен способ динамического определения первичного ключа таблицы, так что у меня будет такой запрос:

$sql = sprintf("UPDATE %s SET %s=%s WHERE PRIMARY_KEY = %s", ...);

Есть ли ключевое слово MySQL для первичного ключа таблицы или способ его получения?

Я использовал базу данных information_schema раньше, чтобы найти такую ​​информацию, но было бы неплохо, если бы мне не пришлось прибегать к этому.

4b9b3361

Ответ 1

SHOW INDEX FROM <tablename>

Вам нужна строка, где Key_name = PRIMARY

http://dev.mysql.com/doc/refman/5.0/en/show-index.html

Вероятно, вы захотите кэшировать результаты - для выполнения инструкций SHOW требуется некоторое время для всех таблиц, которые могут вам понадобиться.

Ответ 2

Это может быть не рекомендуется, но работает нормально:

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY';

Простым способом является использование information_schema:

SELECT k.COLUMN_NAME
FROM information_schema.table_constraints t
LEFT JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
    AND t.table_schema=DATABASE()
    AND t.table_name='owalog';

Как представлено на mysql-list. Однако его несколько раз медленнее от первого решения.

Ответ 4

Также

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY';

Является эквивалентным

SHOW KEYS FROM <table_name> WHERE Key_name = 'PRIMARY';

введите описание изображения здесь

Ответ 5

Основываясь на ответах @jake-sully и @lukmdo, делая слияние своего кода, я закончил со следующим фрагментом:

SELECT `COLUMN_NAME`
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = DATABASE())
AND (`TABLE_NAME` = '<tablename>')
AND (`COLUMN_KEY` = 'PRI');

Надеюсь, что это может помочь кому-то