2013-03-15 11 views
6

Wie kann ich den Namen der auto_increment Spalte aus einer Tabelle (nicht die letzte INSERT ID)?Detect Auto Increment Spalte

zum Beispiel:

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

Was kann ich die member_id aus der Tabelle Mitglieder erhalten tun.

Ich mache eine PHP-Klasse, und ich werde eine Methode hinzufügen, dass Sie dies so erhalten erlaubt:

$members->findById(123); 

Es wissen sollten die Auto-Increment-Spalte und bauen eine Abfrage basiert finden Dann mache ich die Abfrage.

+0

Aber ich den Einsatz id nicht brauchen, ich brauche den Spaltennamen. –

+1

Abstimmung zum erneuten Öffnen. Diese Frage wurde als Duplikat markiert, aber die andere Frage ist anders. –

Antwort

8

Sie können die Spalte mit

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

Die erste Spalte Field ist Ihre auto_increment Spaltennamen erhalten.

$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

Warum runterladen? .... das ist eine gute Antwort! – beck03076

0

Sie müssen die Anweisung basierend auf dem information_schema dynamisch vorbereiten und dann ausführen.

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

Try this!

1

Ich habe diese Art von Funktion als Teil der Zend_Db-Komponente implementiert, als ich am Zend Framework gearbeitet habe. Ich habe festgestellt, dass der Zugriff auf die INFORMATION_SCHEMA zu langsam ist, daher musste ich DESCRIBE verwenden.

So etwas wie die folgenden (aber dieser Code vereinfacht ich nur getestet, die nicht Teil von Zend Framework):

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

Probleme mit der Langsamkeit des Informationsschemas können gelöst werden mit: 'set global innodb_stats_on_metadata = 0;' –

+0

@MichaelBenjamin, danke, dass ich über diese Konfigurationsvariable weiß. Es ist eine gute Problemumgehung. Es ist jedoch möglicherweise nicht festgelegt, und die PHP-App verfügt möglicherweise nicht über die Berechtigung SUPER, um globale Variablen zu ändern. –

+0

'set Sitzung innodb_stats_on_metadata = 0;' für Abfragen mit Informationsschema in diesem Fall. –

Verwandte Themen