如何以编程方式获取某些表的主键?我知道我可以运行一些查询,如“显示创建表”或“显示键”,但之后我将不得不解析主键的结果。想知道是否有一种简单的方法可以做到这一点。
问问题
98 次
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)
两个警告:
- 这可能不适用于除主键以外的其他键
如果您有很长的列名或引用很多列的键,您可能会遇到 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 回答