【问题标题】:How to identify composite primary key in any Mysql Database table?如何识别任何 Mysql 数据库表中的复合主键?
【发布时间】:2011-02-20 08:51:41
【问题描述】:

如何识别任何 Mysql 数据库表中的复合主键? 或

编辑 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:您可能想在我更新的答案中尝试查询。

标签: mysql primary-key composite-key


【解决方案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 ...我希望你明白我的意思.. :)
    猜你喜欢
    • 2020-04-11
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多