如何识别任何 Mysql 数据库表中的复合主键?
Posted
技术标签:
【中文标题】如何识别任何 Mysql 数据库表中的复合主键?【英文标题】:How to identify composite primary key in any Mysql Database table? 【发布时间】:2011-02-20 08:51:41 【问题描述】:或
编辑 2 应该使用什么sql查询 显示任何表的的确数 包含复合主键?
我在 mysql 数据库中有很多表,它们有 2 个或 3 个主键的复合键,我正在使用 phpmyadmin,我必须编写一个 php 脚本来识别哪个表有复合键,现在我可以识别使用查询的表的主键
SHOW INDEXES FROM `".$row3['TABLE_NAME']."` WHERE Key_name = 'PRIMARY'
这给了我我想要的东西,但是现在我怎样才能找到我有复合键的索引?
编辑 1
在 Daniel Image 评论的上下文中 查找复合主键 phpmyadmin
复合主键在 phpmyadmin 中如下所示:
【问题讨论】:
你说的识别是什么意思?你使用什么工具? phpMyAdmin? SQLyog?还是您想以编程方式进行?如果有,是什么语言? @OM The Eternity:RE 图像,这还不足以识别您的密钥是复合的吗? (由moduleid
和menuid
组成)
我的朋友丹尼尔请尝试理解我的 php 脚本没有眼睛来识别复合键... :) 请告诉我任何方法来找出“这个表有复合主键.. .." 请正确阅读我的问题...
@OM The Eternity:您可能想在我更新的答案中尝试查询。
【参考方案1】:
SELECT COUNT( * ) num_keys
FROM information_schema.KEY_COLUMN_USAGE
WHERE table_name = 'jos_modules_menu'
AND constraint_name = 'PRIMARY'
AND table_schema = 'pranav_test'
感谢丹尼尔和普拉纳夫 :)
【讨论】:
【参考方案2】:更新:
关于更新后的问题,您可能希望在 PHP 脚本中使用以下内容:
SELECT COUNT(*) num_keys
FROM information_schema.KEY_COLUMN_USAGE
WHERE table_name ='tb' AND constraint_name = 'PRIMARY';
如果表 tb
具有复合主键,则此查询将返回 num_keys
> 1。
我不确定我是否理解您想要实现的目标,但您可能需要考虑使用SHOW INDEX
,如下所示:
CREATE TABLE tb (a int, b int, c int);
Query OK, 0 rows affected (0.21 sec)
ALTER TABLE tb ADD CONSTRAINT pk_tb PRIMARY KEY (a, b);
Query OK, 0 rows affected (0.06 sec)
SHOW INDEX FROM tb WHERE key_name='PRIMARY';
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tb | 0 | PRIMARY | 1 | a | A | NULL | NULL | NULL | | BTREE | |
| tb | 0 | PRIMARY | 2 | b | A | 0 | NULL | NULL | | BTREE | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
2 rows in set (0.02 sec)
如果它不是一个复合键,你只会在SHOW INDEX
查询中得到一行:
CREATE TABLE tb2 (a int, b int, c int);
Query OK, 0 rows affected (0.05 sec)
ALTER TABLE tb2 ADD CONSTRAINT pk_tb PRIMARY KEY (a);
Query OK, 0 rows affected (0.05 sec)
SHOW INDEX FROM tb2 WHERE key_name='PRIMARY';
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tb2 | 0 | PRIMARY | 1 | a | A | 0 | NULL | NULL | | BTREE | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.02 sec)
【讨论】:
Daniel 如果你知道 phpmyadmin gui,它会在一行中显示复合键......一个接一个地逐步...... @OM:你没有得到类似的东西吗? img248.imageshack.us/img248/6843/showindex.png 不,不是这样的,更新问题我已经把图片贴在那里了... @OM The Eternity:看起来它返回了数据库中所有键的计数。您确定您有WHERE table_name ='your_table_name'
过滤器吗?...此外,如果您在许多模式中使用相同的表名,您可能需要添加`AND table_schema = 'your_schema_name'`。
@Daniel 我从信息架构中选择了正确的查询...请参阅下面我给出的答案...我们还需要指定 table_schema 否则我将输出所有 dbs 公用表的名称 num_keys ...我希望你明白我的意思.. :)以上是关于如何识别任何 Mysql 数据库表中的复合主键?的主要内容,如果未能解决你的问题,请参考以下文章