我对外键约束有疑问。所以我为了测试目的制作了两个简单的表格。外键约束允许父键被删除
mysql> EXPLAIN parent;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.01 sec)
mysql> EXPLAIN child;
+-----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| parent_id | int(11) | NO | MUL | NULL | |
+-----------+---------+------+-----+---------+----------------+
现在我没有在创建表时指定外键约束。我后来添加它如下。
ALTER TABLE child
ADD CONSTRAINT parent_fk FOREIGN KEY(parent_id) REFERENCES parent(id);
我检查用于表和它的InnoDB
的engine
。我的问题是...
为什么它不限制我删除父记录中有几个依赖子记录的记录?默认情况下,它应该限制我的权利?
如果我在添加外键约束之前在外键字段上创建索引,则其按预期工作。我是否每次都需要创建索引?
- 在创建表之后添加任何类型的约束是否是不好的做法?
默认是'RESTRICT',是的。你可以用'SHOW CREATE TABLE child'来检查;'FK是否已经被实际定义(正确)? –
是的,它是.. ** KEY'parent_fk'('parent_id'), CONSTRAINT'parent_fk' FOREIGN KEY('parent_id')REFERENCES'parent'('id')** –