我创建了一个具有唯一索引和外部索引的表。当我添加唯一键时,我得到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 | | |
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
答案 0 :(得分:2)
首先,外键和唯一约束不是索引,它们是约束。但是为了有效地执行这些约束,大多数DBMS都使用索引。
在MySQL中,UNIQUE KEY
和UNIQUE INDEX
在表定义中是相同的,它们的意思是:添加索引和唯一约束。
对于外键,情况有点不同。在InnoDB引擎中,当您添加FOREIGN KEY
约束时,会创建引用列的索引,但仅当索引尚不存在时才会生成。
您的idx_customer_id_status
索引是(customer_id, status)
复合索引,此索引可用于外键约束。因此,没有创建额外的索引。
答案 1 :(得分:1)
在MySQL
land中,外键不是索引,并且不会显示在索引列表中。 MySQL的原始愿景不包括外键表关系,它只包括每表索引以改善选择性能改进。
InnoDB最初是第三方“扩展”(不确定MySQL的正确术语),它增加了不那么快速但更兼容的表,其中包括外键关系。因为它们从未成为原始愿景的一部分,所以它们从未被合并到show index
或describe table
命令中。
结帐this older question了解一些获取表上外键列表的方法。您的选择是对information_schema
的慢查询,或解析SHOW CREATE TABLE
命令的结果。