2013-03-15 5 views
6

मैं तालिका (अंतिम INSERT आईडी नहीं) से auto_increment कॉलम नाम कैसे प्राप्त कर सकता हूं?ऑटो वृद्धि कॉलम का पता लगाएं

उदाहरण के लिए

:

create table members (member_id int auto_increment, name char(50), primary key(member_id)); 

क्या मैं मेज के सदस्यों से member_id प्राप्त करने के लिए कर सकते हैं।

मैं एक php वर्ग बनाने रहा हूँ, और मैं एक विधि है कि आप इस तरह से यह प्राप्त करने के लिए अनुमति देगा जोड़ने जा रहा हूँ:

$members->findById(123); 

यह ऑटो वेतन वृद्धि स्तंभ को खोजने के लिए जानते हैं और एक प्रश्न का निर्माण करना चाहिए आधारित उस पर क्वेरी करें।

+0

लेकिन मैं डालने आईडी की जरूरत नहीं है, मैं स्तंभ नाम की जरूरत है। –

+1

फिर से खोलने के लिए वोटिंग। यह प्रश्न डुप्लिकेट के रूप में चिह्नित किया गया था, लेकिन दूसरा प्रश्न अलग है। –

उत्तर

8

आप

show columns from members where extra like '%auto_increment%' 

पहले कॉलम Field अपने auto_increment स्तंभ नाम है के साथ स्तंभ मिल सकती है।

$sql = "show columns from members where extra like '%auto_increment%'"; 
$sth = $dbh->prepare($sql) or die($dbh->error()); 
$sth->execute() or die($dbh->error()); 
$row = $sth->fetch(); 
$column = $row['Field']; 
+3

क्यों डाउनवोट? .... यह एक अच्छा जवाब है! – beck03076

0

आपको info_schema के आधार पर गतिशील रूप से कथन तैयार करना होगा, फिर इसे निष्पादित करना होगा।

PREPARE stmt FROM concat(
'select * from members where ', 
(select COLUMN_NAME 
    from INFORMATION_SCHEMA.COLUMNS 
    where table_name='members' and EXTRA like '%auto_increment%'), 
    '=?' 
); 
EXECUTE stmt; 
1
SELECT column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = "members" 
AND  extra = "auto_increment"; 

इस कोशिश करो!

1

मैंने ज़ेंड फ्रेमवर्क पर काम करते समय Zend_Db घटक के हिस्से के रूप में इस प्रकार के फ़ंक्शन को कार्यान्वित किया। मैंने पाया कि INFORMATION_SCHEMA तक पहुंच बहुत धीमी है, इसलिए मुझे इसके बजाय DESCRIBE का उपयोग करना पड़ा।

कुछ निम्नलिखित (लेकिन यह कोड मैं सिर्फ परीक्षण किया है, Zend फ्रेमवर्क का हिस्सा नहीं सरल है) की तरह:

function getAutoIncColumn($table) 
{ 
    global $dbh; 

    $stmt = $dbh->query("DESCRIBE `$table`"); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     if (strstr($row["Extra"], "auto_increment")) { 
     return $row["Field"]; 
     } 
    } 
    return null; 
} 
+0

सूचना स्कीमा धीमेपन के साथ समस्याएं हल की जा सकती हैं: 'वैश्विक innodb_stats_on_metadata = 0; ' –

+0

@ माइकलबेनजमिन, धन्यवाद, मैं उस कॉन्फ़िगर चर के बारे में जानता हूं। यह एक अच्छा कामकाज है। लेकिन यह सेट नहीं किया जा सकता है, और PHP ऐप में वैश्विक चर बदलने के लिए आवश्यक सुपर विशेषाधिकार नहीं हो सकता है। –

+0

'सेट सत्र innodb_stats_on_metadata = 0;' उस मामले में सूचना स्कीमा का उपयोग कर क्वेरी के लिए। –

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