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 раньше, чтобы найти такую информацию, но было бы неплохо, если бы мне не пришлось прибегать к этому.
Ответы
Ответ 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. Однако его несколько раз медленнее от первого решения.
Ответ 3
Лучший способ получить столбцы первичного ключа:
SELECT `COLUMN_NAME`
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'dbName')
AND (`TABLE_NAME` = 'tableName')
AND (`COLUMN_KEY` = 'PRI');
Из http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html
Ответ 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');
Надеюсь, что это может помочь кому-то