2009-05-21 15 views
19

Jestem, generując kwerendy SQL, jak to w PHP:MySQL: Określić stołu klucz podstawowy dynamicznie

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

Ponieważ prawie każda część tej kwerendy jest dynamiczne potrzebne sposobem, aby określić klucz podstawowy tabeli dynamicznie tak, że musiałbym zapytać tak:

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

istnieje słowo kluczowe MySQL dla klucza podstawowego tabeli, lub sposób je zdobyć?

Użyłem DB informacji wcześniej, aby znaleźć takie informacje, ale byłoby miło, gdybym nie musiał uciekać się do tego.

Odpowiedz

31
SHOW INDEX FROM <tablename> 

Chcesz wiersz gdzie KEY_NAME = Primary

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

Prawdopodobnie będziesz chciał buforować wyniki - to zajmuje trochę czasu, aby uruchomić SHOW wypowiedzi na wszystkich stołach mogą być potrzebne pracować z.

+14

Dzięki, że jest wielki . Skończyło się na tym, że: SHOW KEY OD WHERE Key_name = 'PRIMARY' – macinjosh

+1

Powoduje zwrócenie całego wiersza ... jeśli chcesz tylko nazwę kolumny, zobacz odpowiedź Jake Sully poniżej. – Andrew

+0

Jako facet, który napisał tę odpowiedź, muszę się zgodzić: odpowiedź Jake Sully jest jak dotąd najlepsza. @macinjosh Polecam, nie przyjmując mojej odpowiedzi i akceptując zamiast tego Jake'a. –

20

To może być nie poradził, ale działa dobrze:

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

Stałą sposobem jest użycie 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'; 

Jak przedstawiono na mysql-list. Jest to jednak kilka razy wolniejsze od pierwszego rozwiązania.

+0

Witam, wiem, że to stary post, ale chciałem tylko zapytać, dlaczego powiedziałeś, że pierwsza metoda nie jest zalecana. Przyjęta odpowiedź z [tego duplikatu pytania] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) mówi, że nie zawsze masz dostęp do pliku informacyjnego, więc sugeruje on pierwsze metoda.Plus sam powiedziałeś, że druga metoda jest kilka razy wolniejsza niż pierwsze rozwiązanie. Jeśli tak, dlaczego druga metoda jest solidna? Dzięki. –

+0

Jak wskazano w http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html, nie można go użyć jako zmiennej mysql lub wyświetlić widok itp., Ale jeśli pierwszy przypadek działa w twoim scenariuszu idź na niego @Andrew – lukmdo

0

Również

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

jest równoważna

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

enter image description here

0

podstawie @ jake-Sully i @lukmdo odpowiedzi, dzięki czemu scalanie ich kodu, skończyłem z następującym fragmencie:

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

nadzieję, że może to pomóc komuś

Powiązane problemy