为什么在删除或更新时不使用外键而没有操作

Pre*_*exo 21 mysql myisam innodb foreign-keys

我有一个感兴趣的问题:

我有2代表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和外键,如果我最终没有真正使用外键的魔力呢?
还有一点是使用
和外键
而不是
而没有外键.
如果我只是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约束".

  • 我同意提问者的意见."NO ACTION"不会传达与"DEFAULT ACTION"相同的内容.对我来说,"没有行动"似乎表明"不做任何事",这也是荒谬的. (2认同)

Mic*_*ski 9

外键约束即使不ON DELETE / UPDATE CASCADE确保如果将值插入子表,它在父表中具有正确匹配的值(或者NULL如果FK列可以为空).尝试在子表的FK列中插入无效值会在约束失败时导致错误,因此您的数据完整性受到保护.

错误1452(23000):无法添加或更新子行:外键约束失败

定义外键约束还隐式定义子表中FK列的索引,尽管您可以手动定义索引,但这样可以提高连接性能.

ON DELETE NO ACTION(与省略该ON DELETE子句相同)将主动阻止删除父行(如果它被任何子表引用),而不是被动地允许删除它而不影响子行.