2009-05-21 18 views
19

Sono, generando una query SQL come questo in PHP:MySQL: Determinare ping-chiave primaria in modo dinamico

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

Dal momento che quasi ogni parte di questa query è dinamico Ho bisogno di un modo per determinare la chiave primaria della tabella in modo dinamico , in modo che mi piacerebbe avere una query come questa:

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

c'è una parola chiave di MySQL per la chiave primaria di una tabella, o un modo per farlo?

Ho usato il DB di information_schema prima per trovare informazioni come questa, ma sarebbe bello se non dovessi ricorrere a quello.

risposta

31
SHOW INDEX FROM <tablename> 

si desidera che la riga in cui key_name = PRIMARIA

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

Probabilmente si vorrà mettere in cache i risultati - ci vuole un po 'per l'esecuzione MOSTRA dichiarazioni su tutti i tavoli si potrebbe aver bisogno lavorare con.

+14

Grazie, che è grande . Ho finito per usare questo: SHOW KEYS FROM WHERE Key_name = 'PRIMARY' – macinjosh

+1

Questo restituisce l'intera riga ... se si desidera solo il nome della colonna, vedere la risposta di Jake Sully sotto. – Andrew

+0

Come il ragazzo che ha scritto questa risposta, devo essere d'accordo: la risposta di Jake Sully è la migliore finora. @macinjosh ti consiglierei di non accettare la mia risposta e accettare invece Jake. –

20

Potrebbe non essere consigliato, ma funziona bene:

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

Il modo più solido è quello di utilizzare 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'; 

Come presentato sul mysql-list. Tuttavia è un paio di volte più lento dalla prima soluzione.

+0

Ciao, so che questo è un vecchio post ma volevo solo chiederti perché hai detto che il primo metodo non è consigliato. La risposta accettata da [questa doppia domanda] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) dice che non si ha sempre accesso a information_schema in modo che suggerisca il primo metodo.Inoltre hai detto a te stesso che il secondo metodo è un paio di volte più lento della prima soluzione. Se questo è il caso, perché il secondo metodo è solido? Grazie. –

+0

Come indicato in http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html non può essere usato come variabile mysql o come think view ecc. Ma se il primo caso funziona nel tuo scenario vai per questo @Andrew – lukmdo

0

anche

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

equivale a

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

enter image description here

0

Sulla base @ jake-sully e @lukmdo risposte, facendo una fusione del loro codice, ho finito con il seguente frammento:

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

Spero che potrebbe aiutare qualcuno

Problemi correlati