2009-05-21 6 views
19

clé primaire, je suis, générer une requête SQL comme ceci en PHP:MySQL: Déterminer Table Dynamiquement

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

Depuis presque toutes les parties de cette requête est dynamique je besoin d'un moyen de déterminer de façon dynamique la clé primaire de la table , de sorte que j'ai une question comme ceci:

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

est-il un mot-clé MySQL pour la clé primaire d'une table ou d'une façon de l'obtenir?

J'ai déjà utilisé la classe information_schema DB pour trouver des informations comme celle-ci, mais ce serait bien si je n'avais pas à recourir à cela.

Répondre

31
SHOW INDEX FROM <tablename> 

Vous voulez la ligne où Key_name = PRIMAIRE

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

Vous voudrez probablement mettre en cache les résultats - il faut un certain temps pour exécuter des instructions SHOW sur toutes les tables que vous pourriez avoir besoin travailler avec.

+14

Merci, ce qui est grand . J'ai fini par utiliser ceci: SHOW KEYS FROM WHERE Nom_clé = 'PRIMAIRE' – macinjosh

+1

Cela retourne la ligne complète ... si vous voulez juste le nom de la colonne, voir la réponse de Jake Sully ci-dessous. – Andrew

+0

En tant que gars qui a écrit cette réponse, je suis d'accord: la réponse de Jake Sully est la meilleure à ce jour. @macinjosh Je recommanderais de ne pas accepter ma réponse et d'accepter Jake à la place. –

20

Il peut être pas conseillé, mais fonctionne très bien:

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

La façon solide est d'utiliser information_schema:

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

Tel que présenté sur le mysql-list. Cependant, c'est quelques fois plus lent de la première solution.

+0

Salut, je sais que c'est un vieux post mais je voulais juste vous demander pourquoi vous avez dit que la première méthode n'est pas conseillée. La réponse acceptée de [cette question en double] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) dit que vous n'avez pas toujours accès à l'information_schema donc il suggère le premier méthode.De plus, vous avez dit vous-même que la deuxième méthode est quelques fois plus lente que la première solution. Si tel est le cas, pourquoi la seconde méthode est-elle solide? Merci. –

+0

Comme indiqué dans http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html il ne peut pas être utilisé comme variable mysql ou think view etc mais si le premier cas fonctionne dans votre scénario allez-y @Andrew – lukmdo

0

également

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

équivaut à

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

enter image description here

0

Basé sur @ jake-sully et @lukmdo réponses, faire une fusion de leur code, je fini avec l'extrait suivant:

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

espère que cela pourrait aider quelqu'un

Questions connexes