Выберите значение первичного ключа, не зная имени поля - PullRequest
3 голосов
/ 01 марта 2012

У меня есть 3 таблицы, images, icons и banners, каждая с уникальным первичным ключом, который также автоматически автоинкремментируется с именами image_id, icon_id и banner_id соответственно.

Я перебираю таблицы выше и мне интересно, есть ли способ выбрать столбец id без указания его конкретного имени.

Что-то вроде

SELECT PRIMARY_KEY
FROM {$table}

Там, где мне не нужно менять структуру таблицы или использовать *, так как будет много данных для возврата и это приведет к замедлению работы моего приложения.

Ответы [ 4 ]

4 голосов
/ 01 марта 2012

Просто назовите столбцы идентификаторов id в каждой таблице. Зарезервируйте имя whatever_id для внешних ключей.

1 голос
/ 01 марта 2012

Я не ЛАМП, но мне кажется, что вы хотите INFORMATION_SCHEMA столы.

Запрос что-то вроде:

SELECT     pk.table_name, column_name as 'primary_key'
FROM       information_schema.table_constraints pk 
INNER JOIN information_schema.key_column_usage C 
                                    on c.table_name = pk.table_name  and
                                       c.constraint_name = pk.constraint_name
where   constraint_type = 'primary key'
           -- and pk.table_name  LIKE '%whatever%'

Этот запрос выше (отфильтрованный по любому нужному набору таблиц) даст вам список имен таблиц и связанных первичных ключей. Что эта информация под рукой вы могли бы запросить что-то вроде:

SELECT {$PK_ColumnName}
FROM {$table}

Обратите внимание, что вам может потребоваться более сложный синтаксис и построитель строк, если у вас есть составные первичные ключи (то есть более одного поля на ключ). Кроме того, информационная схема может быть относительно дорогой для запроса, поэтому вам нужно либо кэшировать настройки результатов, либо запрашивать ее нечасто.

1 голос
/ 01 марта 2012

ПЕРВИЧНЫЙ ключ отличается от столбца, в котором есть первичный ключ. Первичный ключ является как индексом, так и ограничением, которое размещается в одном или нескольких столбцах, а не в самом столбце. Ваш запрос псевдокода:

SELECT PRIMARY_KEY
FROM tablename

эквивалентно этому:

SELECT keyname
FROM tablename

Что неверно. Вам действительно нужно выбрать столбец, а не ключ.

К сожалению, нет псевдонима столбца или простой функции, которую можно использовать для указания столбцов с ограничением первичного ключа. Скорее всего, он недоступен, поскольку первичный ключ может применяться к нескольким столбцам.

Чтобы увидеть, какие столбцы имеют ограничение ключа PRIMARY, вы можете использовать некоторое отражение, запросив таблицы схем, используя SHOW COLUMNS и т. Д. Простое выполнение SELECT * FROM tablename LIMIT 1 даст вам все имена столбцов в результате, если вы хотел предположить, что первый столбец имеет ограничение первичного ключа.

Конечно, вы могли бы просто сделать SELECT * в любом случае, когда вы не знаете имя столбца.

Если вы не хотите делать дополнительный запрос для извлечения имени столбца для построения запроса, используя встроенные метаданные или ваши собственные, я бы прислушался к ответу Марка Б., если вы можете.

0 голосов
/ 01 марта 2012

Или вы можете использовать стандартную команду SQL

show columns from tablename

Будет показан столбец PRI

Проверьте онлайн документацию для получения дополнительной информации

...