2009-05-21 12 views
19

soy, lo que genera una consulta SQL como esto en PHP:MySQL: Determinar la tabla de clave principal dinámicamente

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

Dado que casi todas las partes de esta consulta es dinámico necesito una manera de determinar la clave primaria de la tabla dinámica , por lo que tendría una consulta como esta:

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

¿hay una palabra clave MySQL para la clave principal de una tabla, o una manera de conseguirlo?

He usado el DB de database_schema antes para encontrar información como esta, pero estaría bien si no tuviera que recurrir a eso.

Respuesta

31
SHOW INDEX FROM <tablename> 

desea que el fila donde KEY_NAME = PRIMARIA

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

Es probable que desee almacenar en caché los resultados - se necesita un tiempo para ejecutar comandos SHOW en todas las mesas que pueda necesitar trabajar con.

+14

Gracias, que es grande . Terminé usando esto: MOSTRAR LÍNEAS DESDE WHERE Key_name = 'PRIMARY' – macinjosh

+1

Esto devuelve la fila completa ... si solo quiere el nombre de la columna, consulte la respuesta de Jake Sully a continuación. – Andrew

+0

Como el tipo que escribió esta respuesta, tengo que estar de acuerdo: la respuesta de Jake Sully es la mejor hasta el momento. @macinjosh Recomendaría no aceptar mi respuesta, y aceptar a Jake en su lugar. –

20

Podría no se aconseja, pero funciona muy bien:

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

La forma sólida es utilizar 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'; 

Tal como se presenta en la mysql-list. Sin embargo, es un poco más lento que la primera solución.

+0

Hola, sé que esta es una publicación anterior, pero solo quería preguntarte por qué dijiste que no se aconseja el primer método. La respuesta aceptada de [esta pregunta duplicada] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) dice que no siempre tiene acceso al esquema de información, por lo que sugiere la primera método.Además, dijiste que el segundo método es unas pocas veces más lento que la primera solución. Si ese es el caso, ¿por qué es sólido el segundo método? Gracias. –

+0

Como se indicó en http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html, no se puede usar como variable mysql o think view, etc., pero si el El primer caso funciona en tu escenario. Adelante @Andrew – lukmdo

0

también

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

es equivalente a

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

enter image description here

0

Basado en @ Jake [email protected] y respuestas, haciendo una fusión de su código, he terminado con el siguiente fragmento:

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

esperanza de que pudiera ayudar a alguien

Cuestiones relacionadas