2010-02-26 19 views
44

क्या MySQL-डेटाबेस से प्राथमिक कुंजी फ़ील्ड का नाम प्राप्त करने का कोई तरीका है? उदाहरण के लिए:तालिका की प्राथमिक कुंजी प्राप्त करें?

मैं इस तरह एक मेज है:

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

कहाँ क्षेत्र आईडी प्राथमिक कुंजी है (यह ऑटो वेतन वृद्धि है, लेकिन मुझे लगता है कि उपयोग नहीं कर सकते)। मैं php में फ़ील्ड नाम "आईडी" कैसे पुनर्प्राप्त कर सकता हूं?

उत्तर

83

एक बेहतर तरीका है क्योंकि आप हमेशा INFORMATION_SCHEMA लिए पहुँच नहीं है SHOW KEYS उपयोग करने के लिए है। निम्नलिखित कार्य:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' 

कॉलम_नाम में प्राथमिक कुंजी का नाम होगा।

+1

अच्छा सुझाव। info_schema MySQL 5.0 के रूप में समर्थित है, लेकिन वास्तव में यह विधि भी पुराने संस्करणों के लिए भी काम करती है। –

+17

क्या केवल 'column_name' कुंजी पुनर्प्राप्त करने का कोई तरीका है? – JDelage

+0

यदि आप केवल कॉलम नाम प्राप्त करना चाहते हैं तो 'कट' का उपयोग करें: '| कट-एफ 5' – 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 मामले में, आप इसे भी सरल बना सकते हैं, क्योंकि constraint_name हमेशा 'प्राथमिक' –

+0

होगा, यह बहुत ही संसाधन है कि एलेक्सन का उत्तर बहुत तेज है – Breezer

+0

हाँ, इस क्वेरी में काफी समय लगता है। मैंने जो किया वह टेबल नाम और टेबल आईडी के साथ एक और तालिका है और वहां से लाने की कोशिश कर रहा है, अगर यह तालिका नहीं मिल पाती है, तो यह इस लंबी क्वेरी को बनाता है और इसे नई तालिका में जोड़ता है, बहुत तेज काम करता है। लेकिन एलेक्सन उत्तर भी वास्तव में अच्छा लगता है –

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

यूप, अच्छा सुझाव। हालांकि सीमित, यह 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

ERROR 1054 (42 एस 22): अज्ञात कॉलम 'डीबी' 'जहां खंड' – zloctb

+0

@zloctb: आपके TABLE_SCHEMA द्वारा 'db' का नाम बदलने के बारे में क्या ...? मुझे समझ में नहीं आता कि आपको इस पर +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' 

हालांकि आपको ऐसा करने के लिए info.schema तक पहुंच की आवश्यकता है।

0

मैं तालिका से SHOW INDEX का उपयोग करता हूं; यह मुझे बहुत सारी जानकारी देता है; यदि कुंजी अनूठी है, तो इंडेक्स में इसकी अनुक्रम, कॉलेशन, सब पार्ट, अगर शून्य है, तो इसका प्रकार और टिप्पणी मौजूद है, तो स्क्रीनशॉट देखें here

+0

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

0

MySQL में एक SQL क्वेरी "SHOW INDEX FROM" है जो इंडेक्स लौटाती है एक टेबल से उदाहरण के लिए । - निम्न क्वेरी उत्पादों तालिका के लिए सभी अनुक्रमित दिखाएगा: -

*************************** 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 products \G 

यह प्रकार, स्तंभ, KEY_NAME, आदि और प्रदर्शित करता है उत्पादन सभी अनुक्रमित और के रूप में प्राथमिक कुंजी के साथ साथ एक मेज रिटर्न

सिर्फ तालिका उपयोग से प्राथमिक कुंजी प्रदर्शित करने के लिए: -

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

इस बारे में एक स्पष्टीकरण जोड़ने पर विचार करें कि यह मूल प्रश्न का उत्तर क्यों देता है। –

संबंधित मुद्दे