我试图澄清外键约束的正确用法,并在“on delete”“no action”时保持空白。我将保持通用性,因为iis非常简单,没有深入到有限的细节。
我有一个父表,它有5个子表-所有表中都存在数据(不是新的db构建)。我想建立符合逻辑的东西,以满足我的客户需要和我的期望!所有父表到子表之间存在一种一对多关系,因此:可以有零个或多个记录与父表主键rec相关。决不能有子记录与父记录不相关(我已经检查过以确保这样做)。
因为现在任何子表中都可能有(也可能有)没有父记录和子记录的父记录,所以设置父到子约束是失败的,好吧,我理解为什么,没问题。因此,我将设置儿童对父母的约束:
如果更新了子记录(fk),则将父记录(pk)更新为相同的记录。
如果子记录(fk)被删除,则允许删除子记录,但不对父记录(pk)执行任何操作(非常重要!)
如果父记录被删除,则删除它以及所有子表中的所有相关子记录
不过,我读线程的so和mysql文件说'没有行动'是相同的'限制'这将导致问题,如果我不能删除子记录。我在php代码中主要使用insert-into语句和on-duplicate-key-update语句。我的倾向是完全从db级别删除外键约束,并强制执行我在php/pdo中所做的事情。我实际上是在使用外键约束,因为我认为我必须这样做,但我并没有真正理解这一点,因为无论如何更新主键都不应该发生。
最好的方法是什么。如果“不采取行动”实际上是预防而不是保护,那么什么是一个好的用例呢。
2条答案
按热度按时间3bygqnnd1#
@比尔·卡尔温和这个问题的撰稿人。后来我意识到db设置不正确,这就是为什么我需要删除fk约束才能使用它。数据库是从ms-access迁移而来的,并且,除了一些数据类型的差异之外,当将数据库导入mysql时,外键约束检查也被关闭了,如果不这样做,导入是不可能的。仅此一点就表明ms access中设置的约束规则存在问题。
在mysql中使用导出的db发现了许多孤立记录和索引字段,它们已经违反了fk约束,为null或空在解决这些问题并使数据库/表正常化的基础上,本文提出了一些建议。
谢谢你的意见。
wbrvyc0a2#
“no action”与“restrict”相同,如果无法删除子记录,则会导致问题。
那不是条件的意思。它并不阻止您删除子记录,它阻止您删除父记录,当且仅当存在依赖于父记录的子记录时。
例子:
一张table
Orders
有一对多的关系LineItems
,以及中的外键LineItems
有限制选项。创建一些测试数据:
无法删除订单记录,因为存在依赖于它的行项目:
但我们可以随时删除lineitems记录:
现在没有引用orders记录的lineitems记录,我们也可以删除该记录: