MySQL:Cascade vs. Restrict

时间:2015-01-03 00:03:24

标签: mysql cascade

我正在使用数据库并使用许多外键来连接我的表。默认情况下,MySQL将所有ON UPDATEON DELETE设置为RESTRICT。这似乎工作正常。

然后有一次,我想更改表格中几行的id。此表涉及许多关系,因此我将关系更改为CASCADE,以便将更改级联到使用该id作为外键的表。

现在我想,有没有理由把关系留给RESTRICT,因为CASCADE似乎让我的生活变得更轻松了?

2 个答案:

答案 0 :(得分:2)

有时您确实希望在代码中实现所有关系逻辑。并且您只使用RESTRICT来控制自己 - 在忘记某些案例时查看错误。

另请注意,CASCADE操作有时非常出乎意料,而且对于庞大的代码库,您应始终牢记这一点。因此,根本不使用它们是一个很好的解决方案 - 有助于组织应用程序的设计,BTW。

另一种方法 - 有时你确实有循环关系(例如使用非规范化)并且CASCADE是不可能使用的。

答案 1 :(得分:1)

更改ID应该是非常罕见的事情。抵制诱惑,以消除差距或保持您的ID"整洁,"如果那是你的动力。如果是,那么答案很简单。不,不要。 :)它通常很重要,特别是在更复杂的系统中,给定域中的ID永远不会代表不同的东西,"永远,甚至被时间分开。请注意如果在自动增量表中插入一行,然后回滚插入,即使没有其他竞争操作,也不会重复使用该ID。

如果id是自动增量或任何其他类型的代理键,很少有合理的理由来更改它,并且级联更新更可能仅在响应错误时触发由你或代码制作......不是为了故意改变。

级联更新通常只应考虑自然密钥,因为父表的主键可能实际上需要更新。

自然键是来自现实世界的ID,如车辆的VIN或税务机关分配的一块房地产的地块编号,在理论上比实际操作中更常见。代理键在数据库外部没有任何意义(因此不应暴露给用户),例如自动增量和内部生成的GUID。

如果在正常的事件过程中预期删除父项并且所有子行的突然消失也是合乎需要的,则合法地使用级联删除。

但是,作为一项规则,如果有疑问,RESTRICT始终是最安全的课程。