2010-02-26 36 views
44

有沒有辦法從mysql-database獲取主鍵字段的名稱?例如:獲取表的主鍵?

我有這樣的一個表:

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

凡id字段是主鍵(它有自動遞增,但我不能使用)。我如何檢索字段名稱「身份證」在PHP?

回答

83

一個更好的辦法是使用SHOW KEYS因爲你並不總是有訪問INFORMATION_SCHEMA。以下作品:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' 

COLUMN_NAME將包含主鍵的名稱。

+1

好的建議。 information_schema從MySQL 5.0開始支持,但實際上這種方法也適用於更舊的版本。 – 2010-02-26 12:30:31

+17

有沒有辦法只能檢索'column_name'關鍵? – JDelage 2012-02-14 20:26:58

+0

使用'cut'如果你想獲得剛剛列名:'|切-f5' – whoan 2016-07-19 14:12:31

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的情況下,你甚至可以簡化這個,因爲constraint_name命令將永遠是'PRIMARY' – 2010-02-26 11:53:12

+0

難道不推薦這在所有它是非常耗費資源,需要 alexn的答案是遠遠快 – Breezer 2010-11-02 13:20:59

+0

是啊,這個查詢需要較長的時間。我所做的是用表名和表ID,並試圖從那裏獲取,如果它不能找到表另一個表,所以它使這一長期的查詢,並將其添加到新表,工作要快得多。但alexn答案似乎是真的好太多 – 2011-02-22 09:00:13

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

對於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"; 
+0

是,好建議。雖然是有限的,但這對於初級密鑰來說已經足夠了。 – 2010-02-26 12:29:43

+0

提問者確實說過PHP。 – arleslie 2014-06-22 05:28:57

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

ERROR 1054(42S22):在 'where子句' – zloctb 2014-04-21 16:29:15

+0

@zloctb未知列 'DB':有關重命名'你TABLE_SCHEMA db'什麼...?我不明白你爲什麼得到+1 ... – 2014-11-28 10:24:05

+0

這是最清晰的答案,並立即爲我工作。 – 2014-12-29 17:50:53

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' 

雖然你確實需要訪問該information.schema做到這一點。

0

我用SHOW INDEX FROM表;它給了我很多信息的;如果密鑰是唯一的,則它在索引中的後綴,歸類,子部分,如果爲null,則其類型和註釋(如果存在),請參見此處的截圖here

+0

您能否詳細說明您的答案,並增加關於您提供的解決方案的更多描述? – abarisone 2015-04-10 11:39:42

0

MySQL有一個SQL查詢「SHOW INDEX FROM」從表中。 例如。 - 下面的查詢將顯示爲產品表的所有索引: -

SHOW INDEXES FROM products \G 

它返回一個表型,列名,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

考慮添加一個解釋,爲什麼這會回答原來的問題。 – 2016-04-18 12:56:14