我所关注的问题:
我有2代表的MySQL与InnoDb
。
表tbl_a
具有主键,命名a_id
;
表tbl_b
具有主b_id
和外键tbl_a.a_id
与“ ON DELETE NO ACTION
”。
+-------------+---------------+---------------+
| Table Name | Primary Key | Foreign Key |
+-------------+---------------+---------------+
| tbl_a | a_id | |
| tbl_b | b_id | a_id |
+-------------+---------------+---------------+
我为什么还要使用InnoDB和外键,如果我真的不使用外键的魔力到底的呢?
是否有仍然使用点
InnoDB的外键
代替
MyISAM数据并没有外键 。
如果我只是做“ NO ACTION
上删除或更新”?
我希望你得到了我的兴趣点:)
我想你误会什么ON DELETE NO ACTION
手段。 这并不意味着以抑制外键约束。
当您删除外键所指的纪录时,InnoDB必须采取自动行动,以纠正这种情况的能力:
- 它可以
CASCADE
,这意味着,删除指记录。 (这将让这样的事情感觉user_address.user_id
。如果你硬删除用户,你可能想硬删除所有用户的地址也是如此。) - 它可以
SET NULL
,这意味着,清除掉指键。 (这可能使这样的事情感觉file.last_modified_by
。如果你硬删除用户,你可能希望在文件的最后修改,通过,成为简单的“未知”。)
如果指定NO ACTION
,你告诉你不希望它采取任何这些行动的InnoDB。 所以InnoDB的不能修复你的情况; 所有它能做的就是拒绝DELETE
并返回一个错误。
其结果是, ON DELETE NO ACTION
实际上是相同的ON DELETE RESTRICT
(缺省值)。
(注:在一些的DBMS,并在标准的SQL, ON DELETE NO ACTION
是有点不同的ON DELETE RESTRICT
:在那些ON DELETE NO ACTION
的意思是“接受DELETE
当前事务中,但拒绝整个事务,如果我尝试在纠正问题”之前提交。但是InnoDB中不支持延期支票,所以它把ON DELETE NO ACTION
完全一样ON DELETE RESTRICT
,始终拒绝DELETE
立即 。)
见§§ 14.2.2.5“外键约束”和13.1.17.2“使用外键约束”了MySQL 5.6参考手册中给出。
外键约束,即使没有ON DELETE / UPDATE CASCADE
保证,如果你值插入子表,它具有在父表中的正确的匹配值(或NULL
如果FK列可以为空)。 试图插入一个无效值到子表的FK列会显示错误当约束失败,那么你的数据完整性就会受到保护。
ERROR 1452(23000):不能添加或更新子行,外键约束失败
定义外键约束也隐含地定义在子表中的列FK,这虽然你可能已经手动定义的索引,将提高加盟性能的指标。
ON DELETE NO ACTION
(这是一样的省略ON DELETE
子句)将积极防止父行的删除,如果它是由任何子表引用,而不是被动地允许它在不影响孩子的行被删除。