MySQL: динамически определять первичный ключ таблицы - PullRequest
19 голосов
/ 21 мая 2009

Я генерирую 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 прежде, чтобы найти такую ​​информацию, но было бы неплохо, если бы мне не пришлось прибегать к этому.

Ответы [ 5 ]

31 голосов
/ 21 мая 2009
SHOW INDEX FROM <tablename>

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

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

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

20 голосов
/ 24 марта 2010

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

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

Надежный способ - использовать информационную схему:

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

17 голосов
/ 01 июня 2011

Лучший способ получить столбцы первичного ключа:

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 / лучший способ получения первичного ключа-столбца.html

0 голосов
/ 10 февраля 2017

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

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

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

0 голосов
/ 29 декабря 2016

Также

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

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

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

enter image description here

...