Я создаю 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, чтобы найти такую информацию, но было бы неплохо, если бы мне не пришлось прибегать к этому.
SHOW INDEX FROM <tablename>
Вам нужна строка, где Key_name = PRIMARY
http://dev.mysql.com/doc/refman/5.0/en/show-index.html
Вероятно, вам захочется кэшировать результаты – для выполнения инструкций SHOW требуется некоторое время для всех таблиц, с которыми вам нужно будет работать.
Это может быть не рекомендуется, но работает нормально:
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-списке . Однако его несколько раз медленнее от первого решения.
Лучший способ получить столбцы первичного ключа:
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
Также
SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY';
Эквивалентно
SHOW KEYS FROM <table_name> WHERE Key_name = 'PRIMARY';
Основываясь на ответах @ jake-sully и @lukmdo, делая слияние своего кода, я закончил со следующим фрагментом:
SELECT `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE (`TABLE_SCHEMA` = DATABASE()) AND (`TABLE_NAME` = '<tablename>') AND (`COLUMN_KEY` = 'PRI');
Надеюсь, это может помочь кому-то