2009-05-21 4 views
19

Я, порождая SQL запрос, как это в PHP:MySQL: Определение таблицы Первичный ключ Динамическое

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

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

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

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

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

ответ

31
SHOW INDEX FROM <tablename> 

Вы хотите строку, где KEY_NAME = PRIMARY

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

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

+14

Спасибо, что является большим , Я закончил использовать это: SHOW KEYS FROM WHERE Key_name = 'PRIMARY' – macinjosh

+1

Это возвращает полную строку ... если вы хотите просто имя столбца, см. Ответ Джейка Салли ниже. – Andrew

+0

Как парень, который написал этот ответ, я должен согласиться: ответ Джейка Салли - самый лучший. @macinjosh Я бы рекомендовал отказаться от моего ответа и вместо этого принять Джейка. –

20

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

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. Однако его несколько раз медленнее от первого решения.

+0

Привет, я знаю, что это старый пост, но я просто хотел спросить, почему вы сказали, что первый метод не рекомендуется. В принятом ответе [этого дублирующего вопроса] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) говорится, что у вас не всегда есть доступ к информационной_схеме, поэтому он предлагает первый метод.Плюс вы сказали себе, что второй метод в несколько раз медленнее первого решения. Если это так, почему второй метод твердый? Благодарю. –

+0

Как указано в http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html, он не может быть использован как переменная mysql или мнение view и т. Д., Но если первый случай работает в вашем сценарии для этого @Andrew – lukmdo

0

Также

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

эквивалентно

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

enter image description here

0

на основе @ Jake-Сюлл и @lukmdo ответов, делая слияние своего кода, я закончил со следующим фрагментом:

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

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

Смежные вопросы