2009-05-21 13 views
19

Ich bin, eine SQL-Abfrage wie dies in PHP zu erzeugen:MySQL: Bestimmen Tabelle Primärschlüssel dynamisch

$sql = sprintf("UPDATE %s SET %s = %s WHERE %s = %s", ...); 

Seit fast jedem Teil dieser Abfrage dynamisch ich einen Weg, müssen die Tabellenprimärschlüssel dynamisch zu bestimmen, , so dass ich würde eine Abfrage wie diese:

$sql = sprintf("UPDATE %s SET %s=%s WHERE PRIMARY_KEY = %s", ...); 

gibt es ein MySQL Schlüsselwort für eine Primärschlüssel der Tabelle, oder ein Weg, es zu bekommen?

Ich habe die information_schema DB verwendet, bevor Informationen wie diese zu finden, aber es wäre schön, wenn ich nicht auf die zurückgegriffen werden musste.

Antwort

31
SHOW INDEX FROM <tablename> 

Sie wollen die Zeile, in Key_name = PRIMARY

http://dev.mysql.com/doc/refman/5.0/en/show-index.html

Sie werden wahrscheinlich wollen die Ergebnisse zwischenzuspeichern - es dauert eine Weile, SHOW-Anweisungen auf allen Tabellen laufen Sie benötigen arbeiten mit.

+14

Dank helfen könnte, das ist großartig . Ich landete mit dieser: SHOW KEYS FROM WHERE Key_name = ‚Primary‘ – macinjosh

+1

Diese die vollständige Zeile zurückgibt ... wenn Sie nur den Spaltennamen möchten, finden Jake Sully Antwort unten. – Andrew

+0

Als Mann, der diese Antwort schrieb, muss ich zustimmen: Jake Sully Antwort die beste ist so weit. @macinjosh Ich würde empfehlen, un annehme meine Antwort und die Annahme von Jakes statt. –

20

Es ist vielleicht nicht beraten, sondern funktioniert gut:

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY'; 

Die feste Art und Weise ist information_schema zu verwenden:

SELECT k.COLUMN_NAME 
FROM information_schema.table_constraints t 
LEFT JOIN information_schema.key_column_usage k 
USING(constraint_name,table_schema,table_name) 
WHERE t.constraint_type='PRIMARY KEY' 
    AND t.table_schema=DATABASE() 
    AND t.table_name='owalog'; 

Wie auf den mysql-list präsentiert. Allerdings ist es ein paar Mal langsamer von der ersten Lösung.

+0

Hallo, ich weiß, das ist eine alte Post, aber ich wollte nur fragen, warum du sagtest die erste Methode nicht empfohlen. Die akzeptierte Antwort von [diese doppelte Frage] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) besagt, dass Sie nicht immer Zugriff auf das information_schema haben, also schlägt es das erste vor Methode.Plus Sie sagten selbst, dass die zweite Methode einige Male langsamer als die erste Lösung ist. Wenn das der Fall ist, warum ist die zweite Methode solide? Vielen Dank. –

+0

Wie in http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html gezeigt, kann es nicht als MySQL-Variable oder Think-View usw. verwendet werden, aber wenn die erster Fall funktioniert in Ihrem Szenario gehen Sie für ihn @Andrew – lukmdo

0

Auch Ist

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY'; 

entspricht

SHOW KEYS FROM <table_name> WHERE Key_name = 'PRIMARY'; 

enter image description here

0

Basierend auf @ jake-besudeln und @lukmdo Antworten, eine Zusammenführung ihres Codes machen, ich mit dem folgenden Ausschnitt beendet:

SELECT `COLUMN_NAME` 
FROM `information_schema`.`COLUMNS` 
WHERE (`TABLE_SCHEMA` = DATABASE()) 
AND (`TABLE_NAME` = '<tablename>') 
AND (`COLUMN_KEY` = 'PRI'); 

Hoffe, dass es jemand

Verwandte Themen