2009-05-21 42 views
19

我,產生這樣的SQL查詢在PHP中:MySQL的:確定表的主鍵動態

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

由於幾乎每到這個查詢的一部分是動態的,我需要一種方法來動態確定表的主鍵,讓我有這樣的查詢:

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

是否有一個MySQL的關鍵字爲表的主鍵,或一種方式來獲得它?

我以前使用過information_schema數據庫來查找這樣的信息,但如果我不必訴諸於此,那就好了。

回答

31
SHOW INDEX FROM <tablename> 

你想去的地方KEY_NAME =主

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

你可能會想緩存結果的行 - 它需要一段時間才能對你可能需要的所有表運行SHOW語句跟...共事。

+14

謝謝,這是偉大的。我結束了使用這個: 顯示鍵從 WHERE Key_name ='PRIMARY' – macinjosh 2009-05-21 17:13:39

+1

這將返回完整的行......如果您只想列名稱,請參閱下面的Jake Sully的答案。 – Andrew 2016-02-11 17:53:55

+0

作爲寫這個答案的人,我必須同意:到目前爲止,傑克蘇利的答案是最好的答案。 @macinjosh我建議不要接受我的回答,而是接受傑克的回答。 – 2016-03-10 23:53:42

20

這可能是不建議,但工作得很好:

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

固體的方法是使用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'; 

由於在mysql-list呈現。然而,它比第一種解決方案慢了幾倍。

0

而且

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

是相當於

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

enter image description here

0

基於@傑克 - 薩利和@lukmdo答案,使他們的代碼合併,我完成了下面的代碼片段:

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

希望它可以幫助別人