MySQL:级联与限制

MySQL:级联与限制,mysql,cascade,Mysql,Cascade,我正在处理一个数据库,并使用许多外键连接我的表。默认情况下,MySQL将更新时的和删除时的设置为RESTRICT。这似乎很管用 有一次,我想更改表中几行的id。该表涉及许多关系,因此我将关系更改为CASCADE,以便将更改级联到使用该id作为外键的表 现在我在想,有没有什么理由把关系保留为RESTRICT,因为CASCADE似乎让我的生活更轻松了?有时您确实希望在代码中实现所有关系逻辑。你使用RESTRICT仅仅是为了控制自己——当你忘记了某些情况时,可以看到错误 还要记住,CASCADE操作有

我正在处理一个数据库,并使用许多外键连接我的表。默认情况下,MySQL将更新时的
和删除时的
设置为
RESTRICT
。这似乎很管用

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


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

有时您确实希望在代码中实现所有关系逻辑。你使用
RESTRICT
仅仅是为了控制自己——当你忘记了某些情况时,可以看到错误

还要记住,
CASCADE
操作有时非常意外,对于庞大的代码库,您应该始终记住它。因此,完全不用它们可能是一个很好的解决方案——顺便说一句,这有助于组织应用程序的设计


另一种方法-有时确实存在循环关系(例如,使用非规范化),并且不可能使用
级联

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

如果一个id是一个自动递增或任何其他类型的代理键,那么很少有合法的理由对其进行更改,而且级联更新更有可能只在您或代码出错时触发。。。不是故意的改变

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

自然钥匙是来自真实世界的ID,如车辆的VIN或税务机关指定的房地产包裹号,在理论上比在实际操作中更频繁地被视为主键。。。而代理键在数据库之外没有意义(因此不应该向用户公开),例如自动递增和内部生成的guid

级联删除在正常事件过程中预期会删除父行,并且所有子行也会突然消失的情况下被合法地使用

不过,通常情况下,如果有疑问,
RESTRICT
始终是最安全的做法