Як отримати первинний ключ таблиці?


81

Чи є спосіб отримати ім'я поля первинного ключа з бази даних mysql? Наприклад:

У мене є така таблиця:

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

Де ідентифікатор поля є первинним ключем (він має автоматичне збільшення, але я не можу цим користуватися). Як я можу отримати поля з назвою "id" у php?

Відповіді:


135

Кращий спосіб - використовувати, SHOW KEYSоскільки у вас не завжди є доступ до схеми information_schema. Наступні роботи:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

Ім'я стовпця міститиме ім'я первинного ключа.


1
Гарна пропозиція. Інформаційна схема підтримується станом на MySQL 5.0, але насправді цей метод працює навіть для старих версій.
Роланд Буман

28
Чи є спосіб отримати лише column_nameключ?
JDelage

використовуйте, cutякщо хочете отримати лише ім'я стовпця: `| скоротити -f5`
whoan

34

Ось назва стовпця первинного ключа

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

3
так - це один із способів. У випадку з MySQL ви можете навіть спростити це, тому що constraint_name завжди будеPRIMARY
Roland Bouman

взагалі не рекомендував би це, це дуже ресурс, що вимагає відповіді Alexn набагато швидше
Breezer

так, цей запит займає багато часу. те, що я зробив, це інша таблиця з іменами таблиць та ідентифікаторами таблиць і спроба отримати звідти, якщо вона не може знайти таблицю, тому він робить цей довгий запит і додає його до нової таблиці, працює набагато швидше. але відповідь alexn, здається, теж дуже хороша
Шир Ганс

2
Але це рішення чудово працює при роботі з кількома таблицями. (Просто виберіть k.table_name, k.column_name, k.ordinal_position).
Клаус

21
SELECT kcu.column_name, kcu.ordinal_position
FROM   information_schema.table_constraints tc
INNER JOIN information_schema.key_column_usage kcu
ON     tc.CONSTRAINT_CATALOG = kcu.CONSTRAINT_CATALOG
AND    tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
AND    tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE  tc.table_schema = schema()             -- only look in the current schema
AND    tc.constraint_type = 'PRIMARY KEY'
AND    tc.table_name = '<your-table-name>'    -- specify your table.
ORDER BY kcu.ordinal_position

1
Просто FYI, на SQLServer , constraint_nameвиглядає як UK_entity_name, PK_Users, і FK_Users_Contactsт.д., тому вона не здається , що можна довіряти , щоб мати добре відому платформу агностик значення. 😞
Крістіан

1
Вау! Я не очікував, що ви оновите його. 😅 Окрім кількох речей, це чудово працює! (Я оновив вашу відповідь для вас виправленнями, сподіваюся, ви не проти)
Крістіан

@Christian дякує форту за швидкі подальші дії та виправлення. дуже вдячний!
Роланд Буман


7

Як щодо цього:

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' у 'де речення'
zloctb

1
@zloctb: А як щодо перейменування dbза вашим TABLE_SCHEMA ...? Я не розумію, чому ви отримали +1 на цьому ...
Людовик Гійом

1
Це була найбільш чітка відповідь і відразу ж спрацювала для мене.
Бетті Мок,

5

Якщо ви хочете динамічно генерувати список первинних ключів за допомогою PHP за один раз, без необхідності переглядати кожну таблицю, яку ви можете використовувати

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

хоча для цього вам потрібен доступ до схеми information.sche.


2

Для підходу PHP ви можете використовувати 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";

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

Запитувач дійсно сказав PHP.
arleslie

2

Найкоротший можливий код здається чимось подібним

// $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']; 

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

?>

0

Я використовую ПОКАЗАТИ ІНДЕКС ВІД таблиці; це дає мені багато інформації; якщо ключ унікальний, його послідовність в індексі, сортування, підрозділ, якщо нуль, його тип та коментар, якщо він існує, див. скріншот туттут


Не могли б Ви детальніше розробити свою відповідь, додавши трохи більше опису рішення, яке Ви надаєте?
абарізон

0

MySQL має SQL-запит "SHOW INDEX FROM", який повертає індекси з таблиці. Наприклад, - наступний запит покаже всі індекси для таблиці товарів: -

SHOW INDEXES FROM products \G

Він повертає таблицю з типом, ім'ям стовпця, ім'ям ключа тощо і відображає вихідні дані з усіма індексами та первинними ключами як

*************************** 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

Якщо у вашій базі даних є просторові таблиці, використовуйте:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' OR Key_name = 'OGR_FID'

0

Вам слід використовувати PRIMARY від key_column_usage.constraint_name = "PRIMARY"

зразок запиту,

SELECT k.column_name as PK, concat(tbl.TABLE_SCHEMA, '.`', tbl.TABLE_NAME, '`') as TABLE_NAME
FROM information_schema.TABLES tbl
JOIN information_schema.key_column_usage k on k.table_name = tbl.table_name
WHERE k.constraint_name='PRIMARY'
  AND tbl.table_schema='MYDB'
  AND tbl.table_type="BASE TABLE";

0
SELECT k.column_name
FROM information_schema.key_column_usage k   
WHERE k.table_name = 'YOUR TABLE NAME' AND k.constraint_name LIKE 'pk%'

Я б порекомендував вам спостерігати за всіма полями

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.