Intereting Posts
Нужен ли OpenSSL путь к openssl.conf? Запрещено: у вас нет разрешения на доступ / phpmyadmin на этом сервере php: Значение HTML в Textarea для отображения в Html Email? Php создать zip-файл (из post attachments wordpress) Laravel 4: Предотвращение отправки нескольких форм – токен CSRF Laravel 4 Validation – Вложенные индексированные массивы? Почему моя строка SQL вызывает ошибку «Ошибка сообщения: ошибка синтаксиса: синтаксическая ошибка» в PHP? PHP – opendir на другом сервере Проверка загрузки файлов только при записи создает, а не редактирует Различные результаты для модификатора unicode / multibyte и mb_ereg_replace JavaScript: Как создать JSONP? проверка состояния палиндрома с использованием аргументов функции Как проверить, разрешает ли друг мне опубликовать на стене или не использовать php sdk phpMyAdmin Неустранимая ошибка: вызов неопределенной функции __ () Нужно отображать изображение из базы данных mysql в fpdf

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

 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'); 

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