2012-02-29 4 views
3

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

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

Что-то вроде

SELECT PRIMARY_KEY 
FROM {$table} 

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

+0

Это не будет очень гибко, но если у вас есть только 3 таблицы, вы можете просто иметь функцию или массив сопоставлений, которые просто getPkName ('images') == 'image_id' и т. Д. – Corbin

+0

Да, учитывая мою текущую ситуацию, я мог просто сделать 'substr', чтобы удалить' s' с конца имени табуляции и объединить на нем '_id'. Я просто ищу что-то более гибкое, чем это можно сделать в одном выражении SQL. –

+0

Насколько я знаю, вам нужно будет сделать дополнительный запрос, чтобы получить имя (и использовать PHP). То, что вы могли бы подумать, - это захват всех имен первичных ключей в первый раз и их кеширование. В зависимости от вашей ситуации это может быть ужасная производительность, но это будет держать ее достаточно гибкой. – Corbin

ответ

1

Я не парень LAMP, но мне кажется, что вы хотите, чтобы таблицы 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} 

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

4

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

+0

Это то, что * I * назовет поля, однако существующие запросы в этом приложении будут искать 'whatever_id', и я не думаю, что смогу убедить моего руководителя реструктурировать наши таблицы. –

0

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

show columns from tablename 

Он будет показывать столбец PRI

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

+0

Мне нужно было бы использовать некоторый PHP в приложении для извлечения этого имени поля. Если бы я мог уйти с чем-то вроде 'SELECT (SHOW columns FROM icons WHERE Key = 'PRI') FROM $ table', это было бы неплохо, но оно возвращает целую строку, а не только' Field' –

+0

Это правильно, в PHP у вас будет что-то вроде: for ($ j = 0; $ j Dax

1

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

SELECT PRIMARY_KEY 
FROM tablename 

эквивалентно следующему:

SELECT keyname 
FROM tablename 

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

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

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

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

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

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