Pre*_*exo 21 mysql myisam innodb foreign-keys
我有一个感兴趣的问题:
我有2代表的mysql用InnoDb.
table tbl_a有一个主键,命名为a_id;
table上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 |
+-------------+---------------+---------------+
Run Code Online (Sandbox Code Playgroud)
为什么我仍然会使用InnoDb和外键,如果我最终没有真正使用外键的魔力呢?
还有一点是使用
innodb和外键
而不是
myisam而没有外键.
如果我只是NO ACTION删除或更新?
我希望你有我的兴趣:)
rua*_*akh 60
我认为你误解了什么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 立即拒绝.)
请参阅MySQL 5.6参考手册中的§§14.2.2.5"FOREIGN KEY约束"和13.1.17.2"使用FOREIGN KEY约束".
外键约束即使不ON DELETE / UPDATE CASCADE确保如果将值插入子表,它在父表中具有正确匹配的值(或者NULL如果FK列可以为空).尝试在子表的FK列中插入无效值会在约束失败时导致错误,因此您的数据完整性受到保护.
错误1452(23000):无法添加或更新子行:外键约束失败
定义外键约束还隐式定义子表中FK列的索引,尽管您可以手动定义索引,但这样可以提高连接性能.
ON DELETE NO ACTION(与省略该ON DELETE子句相同)将主动阻止删除父行(如果它被任何子表引用),而不是被动地允许删除它而不影响子行.
| 归档时间: |
|
| 查看次数: |
40706 次 |
| 最近记录: |