我没有看到我创建的外键索引

时间:2012-03-14 17:55:29

标签: mysql magento indexing

我创建了一个具有唯一索引和外部索引的表。当我添加唯一键时,我得到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记录时,b / c级联工作。

为什么不在我的索引列表中显示?两个表都是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      |         |               |
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

MySQL land中,外键不是索引,并且不会显示在索引列表中。 MySQL的原始愿景不包括外键表关系,它只包括每表索引以改善选择性能改进。

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

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