【问题标题】:I'm not seeing a foreign key index that I created我没有看到我创建的外键索引
【发布时间】:2012-03-14 17:55:29
【问题描述】:

我创建了一个具有唯一索引和外部索引的表。当我添加唯一键时,我得到了 MySQL 的成功响应。然后,当我添加外键时,我也会得到成功响应。

添加外键的 SQL 如下:

ALTER TABLE `rewards_customer_index_points` 
ADD CONSTRAINT FOREIGN KEY FK_CUSTOMER_INDEX_POINTS_CUSTOMER_ID(  `customer_id` ) 
REFERENCES  `customer_entity` (  `entity_id` ) 
ON DELETE CASCADE 
ON UPDATE CASCADE

但是,我没有在桌子上看到那个外键,所以它似乎没有被成功创建。但它肯定存在,当我删除引用的 customer_entity 记录时,级联工作。

为什么它没有显示在我的索引列表中?两个表都是 InnoDB。

这是表结构和表上的键:

mysql> explain rewards_customer_index_points;
+-----------------+------------------+------+-----+-------------------+-----------------------------+
| Field           | Type              | Null | Key | Default           | Extra                           |
+-----------------+------------------+------+-----+-------------------+-----------------------------+
| index_points_id | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |
| customer_id     | int(10) unsigned | NO   | MUL | NULL              |                             |
| status          | int(11)          | NO   |     | 0                 |                             |
| points_positive | int(11)          | NO   |     | NULL              |                             |  
| points_negative | int(11)          | NO   |     | NULL              |                             |
| updated_at      | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-----------------+------------------+------+-----+-------------------+-----------------------------+


show index from rewards_customer_index_points;
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                         | Non_unique | Key_name               | Seq_in_index | Column_name     | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment     | Index_comment |
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| rewards_customer_index_points |          0 | PRIMARY                |            1 | index_points_id | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| rewards_customer_index_points |          0 | idx_customer_id_status |            1 | customer_id     | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| rewards_customer_index_points |          0 | idx_customer_id_status |            2 | status          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

【问题讨论】:

  • 很可能,您的表不是 InnoDB 表。见:stackoverflow.com/questions/8960418/…
  • 感谢 Roland,抱歉,我本来打算在我的初始帖子中包含此内容但忘记了,所以我现在正在编辑它。实际上,这两个表都是 InnoDB。
  • 请执行 SHOW CREATE TABLLE 以确定是否创建了外键。

标签: mysql magento indexing


【解决方案1】:

首先,外键和唯一约束不是索引,它们是约束。但为了有效地执行此类约束,大多数 DBMS 都使用索引。

在 MySQL 中,UNIQUE KEYUNIQUE INDEX 在表定义中是同一个东西,它们的意思是:添加索引和唯一约束。

对于外键,情况有点不同。在 InnoDB 引擎中,当您​​添加 FOREIGN KEY 约束时,会在引用列上创建索引,但前提是索引尚不存在。

您拥有idx_customer_id_status 索引,这是一个(customer_id, status) 复合索引,该索引可用于外键约束。因此,没有创建额外的索引。

【讨论】:

  • 谢谢@ypercube!我认为由外键约束创建的索引与约束具有相同的确切名称(这真的很有意义),但我认为这是我这么快假设外键约束肯定是一个的部分原因和索引一样。
  • 不,从您发布的内容来看,仅在 customer_id 上不存在索引。复合索引用于 FK。
【解决方案2】:

MySQL 中,外键不是索引,不会出现在索引列表中。 MySQL 最初的愿景不包括外键表关系,它只包括每个表的索引以提高选择性能。

InnoDB 最初是第三方“扩展”(不确定 MySQL 中的正确术语),它添加了速度较慢但更兼容的表,其中包括外键关系。因为它们从来都不是最初愿景的一部分,所以它们从未被合并到show indexdescribe table 命令中。

查看this older question 了解获取表中外键列表的一些方法。您的选择是对information_schema 的慢速查询,或解析SHOW CREATE TABLE 命令的结果。

【讨论】:

  • 我几乎同意你所说的一切,但FOREIGN KEY 约束与索引在哪块土地上相同?如果说这两个概念有一处混在一起,那就是 MySQL。
猜你喜欢
  • 2018-10-14
  • 2020-04-16
  • 2017-02-09
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2020-07-30
相关资源
最近更新 更多