如何识别任何 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 图像,这还不足以识别您的密钥是复合的吗? (由moduleidmenuid组成) 我的朋友丹尼尔请尝试理解我的 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 数据库表中的复合主键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中使用复合主键从 MySql 中检索数据

RedShift - 如何通过复合主键过滤表中的记录?

mysql外键仅引用复合主键的一部分

仅当复合主键尚不存在时,如何批量插入行? [AWS 红移]

结合实际应用总结mySql语句关键场景用法

如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录