如何在MySQL中获取特定表的主键列名

9
我们的系统会记录每个被更新或插入新内容的表,它会保存表名、更新行的ID值或最后插入的ID以及事件的时间戳。
这非常有用,因为我们可以检查最近更新的表并在更改发生时立即刷新向用户显示的信息,但我们没有将ID列的名称保存在日志中。
问题在于我们正在使用PHP逐个编写程序。
if($tableName == 'Clients'){ $idname = 'CID'; }

有没有一种方法可以直接询问MySQL:给我一个特定表的主键列名,类似于:

SHOW COLUMN_NAME FROM CLEINTS WHERE KEY_NAME = 'PRIMARY KEY';

我记得过去曾使用过类似这样的查询,但我不记得具体是什么了。虽然找到了一些对于 SQL 的解决方案,但它们好像在 MySQL 中不起作用,或者过于复杂(使用 information_schema)。我正在寻找的查询非常简单,几乎就像我刚才给出的例子一样。

谢谢。


也许这可以帮助你:https://dev59.com/Dm435IYBdhLWcg3wyzQJ - Jens
2
关闭:SHOW INDEX FROM CLIENTS WHERE KEY_NAME = 'PRIMARY'; - Nick
1
不错,SHOW INDEX FROM...很好,就快成功了!它返回所有索引,包括key_Name 'primary'和列名,但它返回太多信息了,我只想要主键的名称。谢谢! - multimediaxp
1
尝试这个:SHOW KEYS FROM CLEINTS WHERE Key_name = 'PRIMARY' - Jigar Shah
@Nick,如果你能把那个作为回答添加进去,我会认为它是一个很好的答案,它非常接近并且绝对有用。 - multimediaxp
@JigarShah,这些都很好,认真地将它们添加为答案。我正在寻找类似于:SHOW KEYS.column_name FROM CLIENTS WHERE Key_name = 'PRIMARY' 的东西,也许不可能,请添加您的答案。 - multimediaxp
3个回答

7
您可以从information_schema数据库中获取详细信息。使用以下查询:
SELECT COLUMN_NAME 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'Your_table_name' 
  AND CONSTRAINT_NAME = 'PRIMARY'

太好了!这正是我想要的结果,也许确实需要使用information_schema,谢谢! - multimediaxp
如果你认为这个问题可能对其他用户有用,请给它点赞。谢谢! - multimediaxp
@multimediaxp 在我的案例中,我发现一个特定表的同一列名(PK)出现了三次。因此,我已经在这个方案中添加了DISTINCT子句。请接受这个修改 :) - Madhur Bhaiya
1
Madhur Bhaiya怎么做?我们正在谈论MYSQL。每个表格只能有一个主键,而且所有的键必须有唯一的名称。 - Vykintas

2

您可以通过使用代码获取 KEYS

SHOW KEYS FROM CLEINTS WHERE Key_name = 'PRIMARY'

另一种使用 SHOW 命令获取索引的替代方法,正如 @nick 在评论中提到的那样,是使用 INDEXES

SHOW INDEXES FROM CLEINTS WHERE Key_name = 'PRIMARY'

语法:

SHOW [EXTENDED] {INDEX | INDEXES | KEYS}
    {FROM | IN} tbl_name
    [{FROM | IN} db_name]
    [WHERE expr]

请查看文档链接以获取更多详细信息。


如果您认为这个问题有用,请点赞。谢谢! - multimediaxp

1

我不想使用information_schema,更应该是以SHOW KEYS FROM CLEINTS WHERE Key_name = 'PRIMARY'的形式,正如之前的评论所补充的那样。 - multimediaxp
顺便说一句,它看起来是一个不错的选择,但它返回了一个空结果。 :( - multimediaxp
@multimediaxp 对我有效。我相信您的客户表中有一个错别字。 - Madhur Bhaiya
我检查了一下,所有的代码都写得很好,COLUMN_KEY = 'PRI' 是正确的吗?我尝试过 COLUMN_KEY = 'PRIMARY',但是结果相同,返回为空。 - multimediaxp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接