2010-02-26 3 views
44

Есть ли способ получить имя поля первичного ключа из базы данных mysql? Например:Получить первичный ключ таблицы?

У меня есть таблица вроде этого:

+----+------+ 
| id | name | 
+----+------+ 
| 1 | Foo1 | 
| 2 | Foo2 | 
| 3 | Foo3 | 
+----+------+ 

Если поле идентификатор первичного ключа (она имеет автоматический инкремент, но я не могу использовать это). Как получить имя поля «id» в php?

ответ

83

Лучший способ заключается в использовании SHOW KEYS, так как вы не всегда имеют доступ к information_schema. Следующие работы:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' 

Имя столбца будет содержать имя первичного ключа.

+1

Хорошее предложение. information_schema поддерживается с MySQL 5.0, но этот метод работает и для более старых версий. –

+17

Есть ли способ получить ключ 'column_name'? – JDelage

+0

использовать 'cut', если вы хотите получить только имя столбца:' | cut -f5' – whoan

20

Здесь первичный ключ окнеИМЯстолбец

SELECT k.column_name 
FROM information_schema.table_constraints t 
JOIN information_schema.key_column_usage k 
USING(constraint_name,table_schema,table_name) 
WHERE t.constraint_type='PRIMARY KEY' 
    AND t.table_schema='YourDatabase' 
    AND t.table_name='YourTable'; 
+0

да - это один из способов.В случае с MySQL вы можете даже упростить это, потому что имя ограничения всегда будет «PRIMARY» –

+0

не рекомендовало бы это вообще, это очень ресурс, требующий Ответ alexn намного быстрее. – Breezer

+0

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

10
SELECT kcu.column_name 
FROM information_schema.key_column_usage 
WHERE table_schema = schema()    -- only look in the current db 
AND constraint_name = 'PRIMARY'   -- always 'PRIMARY' for PRIMARY KEY constraints 
AND table_name = '<your-table-name>' -- specify your table. 
2

Для РНР подхода, вы можете использовать mysql_field_flags

$q = mysql_query('select * from table limit 1'); 

for($i = 0; $i < mysql_num_fields(); $i++) 
    if(strpos(mysql_field_tags($q, $i), 'primary_key') !== false) 
     echo mysql_field_name($q, $i)." is a primary key\n"; 
+0

yup, хорошее предложение. хотя и ограниченный, это достаточно хорошо для primaruy ключей. –

+0

Ответчик сказал PHP. – arleslie

1

Я получил его, наконец!

<?php 

function mysql_get_prim_key($table){ 
$sql = "SHOW INDEX FROM $table WHERE Key_name = 'PRIMARY'"; 
$gp = mysql_query($sql); 
$cgp = mysql_num_rows($gp); 
if($cgp > 0){ 
// Note I'm not using a while loop because I never use more than one prim key column 
$agp = mysql_fetch_array($gp); 
extract($agp); 
return($Column_name); 
}else{ 
return(false); 
} 
} 

?> 
5

Как насчет этого.

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'Your Database' 
    AND TABLE_NAME = 'Your Table name' 
    AND COLUMN_KEY = 'PRI'; 


SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'Your Database' 
    AND TABLE_NAME = 'Your Table name' 
    AND COLUMN_KEY = 'UNI'; 
+1

ОШИБКА 1054 (42S22): Неизвестная колонка 'db' in 'where clause' – zloctb

+0

@zloctb: Как насчет переименования 'db' на ваш TABLE_SCHEMA ...? Я не понимаю, почему у вас есть +1 на этом ... –

+0

Это был самый ясный ответ и сразу же работал для меня. –

1

Кратчайший возможный код, кажется, что-то вроде

// $dblink contain database login details 
// $tblName the current table name 
$r = mysqli_fetch_assoc(mysqli_query($dblink, "SHOW KEYS FROM $tblName WHERE Key_name = 'PRIMARY'")); 
$iColName = $r['Column_name']; 
5

использование:

show columns from tablename where `Key` = "PRI"; 
2

Если вы хотите создать список первичных ключей динамически через PHP на одном дыхании, без необходимости пройдите через каждую таблицу, вы можете использовать

SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.key_column_usage WHERE table_schema = '$database_name' AND CONSTRAINT_NAME = 'PRIMARY' 

, хотя для этого вам необходим доступ к информации.schema.

0

Я использую SHOW INDEX FROM table; это дает мне много информации; если ключ уникален, его секвенция в индексе, сортировка, подкатегория, если null, его тип и комментарий, если существует, см. снимок экрана здесь here

+0

Не могли бы вы подробнее рассказать о своем ответе, добавив немного подробного описания вашего решения? – abarisone

0

MySQL имеет SQL-запрос «SHOW INDEX FROM», который возвращает индексы из таблицы. Для примера. - следующий запрос покажет все индексы для таблицы продуктов: -

SHOW INDEXES FROM products \G 

Он возвращает таблицу с типом, column_name, KEY_NAME и т.д., и выходом дисплеев со всеми индексами и первичными ключами, как -

*************************** 1. row *************************** 
     Table: products 
    Non_unique: 0 
    Key_name: PRIMARY 
Seq_in_index: 1 
    Column_name: product_id 
    Collation: A 
    Cardinality: 0 
    Sub_part: NULL 
     Packed: NULL 
     Null: 
    Index_type: BTREE 
     Comment: 
Index_comment: 

Чтобы отобразить только первичный ключ с использованием таблицы: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY' 
+0

Подумайте о том, чтобы добавить объяснение, почему это отвечает на исходный вопрос. –