0

如何以编程方式获取某些表的主键?我知道我可以运行一些查询,如“显示创建表”或“显示键”,但之后我将不得不解析主键的结果。想知道是否有一种简单的方法可以做到这一点。

4

2 回答 2

1
mysql> SHOW COLUMNS FROM foo WHERE `Key` = 'PRI';
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+

现在只需读取列中主键列的名称Field

一个奇怪的方面是它Key必须是反引号。Key尽管通常列名在 MySQL 中不区分大小写,但除非在这种情况下进行分隔,否则它不起作用。

于 2013-08-22T01:11:44.300 回答
1

只要您使用的是“物理”表(即,不是视图),您应该能够foo.bar从 information_schema 数据库中获取表的主键的组成列的单个字符串表示形式:

mysql> SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`')) AS `PRIMARY KEY`
    -> FROM information_schema.KEY_COLUMN_USAGE
    -> WHERE CONSTRAINT_NAME = 'PRIMARY'
    ->   AND TABLE_SCHEMA = 'foo'
    ->   AND TABLE_NAME = 'bar'
    -> ORDER BY ORDINAL_POSITION;
+--------------+
| PRIMARY KEY  |
+--------------+
| `baz`,`zoid` |
+--------------+
1 row in set (0.00 sec)

两个警告:

  1. 这可能不适用于除主键以外的其他键
  2. 如果您有很长的列名或引用很多列的键,您可能会遇到 GROUP_CONCAT 上限:

    mysql> SELECT @@session.group_concat_max_len;
    +--------------------------------+
    | @@session.group_concat_max_len |
    +--------------------------------+
    |                           1024 |
    +--------------------------------+
    1 row in set (0.00 sec)
    

如果需要,您可以通过通常的set 语句为会话更新它。

于 2013-12-28T19:19:35.860 回答