为了账号安全,请及时绑定邮箱和手机立即绑定

何时使用“ON UPDATE CASCADE”

/ 猿问

何时使用“ON UPDATE CASCADE”

慕工程0101907 2019-08-23 16:02:25

何时使用“ON UPDATE CASCADE”

我经常使用“ON DELETE CASCADE”,但我从不使用“ON UPDATE CASCADE”,因为我不太确定在什么情况下它会有用。

为了便于讨论,请看一些代码。

CREATE TABLE parent (
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id));CREATE TABLE child (
    id INT NOT NULL AUTO_INCREMENT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE);

对于“ON DELETE CASCADE”,如果id删除了具有a的父级,parent_id = parent.id则将自动删除子级中的记录。这应该没问题。

  1. 这意味着当id更新父级时,“ON UPDATE CASCADE”会做同样的事情吗?

  2. 如果(1)为真,则意味着如果parent.id不可更新(或永远不会更新),则不需要使用“ON UPDATE CASCADE”,就像它是AUTO_INCREMENT或者总是设置为TIMESTAMP。是对的吗?

  3. 如果(2)不成立,在其他什么情况下我们应该使用“ON UPDATE CASCADE”?

  4. 如果我(由于某种原因)更新了child.parent_id不存在的内容,它会被自动删除吗?

好吧,我知道,上面的一些问题可以通过程序测试来理解,但我也想知道这是否依赖于数据库供应商。

请说清楚。


查看完整描述

3 回答

?
慕容森

确实,如果您的主键只是一个自动递增的标识值,那么您将无法真正使用ON UPDATE CASCADE。

但是,假设您的主键是10位UPC条形码,并且由于扩展,您需要将其更改为13位UPC条形码。在这种情况下,ON UPDATE CASCADE将允许您更改主键值,并且具有该值的外键引用的任何表将相应地更改。

在引用#4时,如果将子ID更改为父表中不存在的内容(并且您具有引用完整性),则应该获得外键错误。


查看完整回答
反对 回复 2019-08-23
?
慕雪6442864
  1. 是的,这意味着,例如,如果你做UPDATE parent SET id = 20 WHERE id = 10所有孩子,parent_id的10也将更新为20

  2. 如果不更新外键引用的字段,则不需要此设置

  3. 想不出任何其他用途。

  4. 您不能这样做,因为外键约束会失败。


查看完整回答
反对 回复 2019-08-23
?
郎朗坤

这是一个很好的问题,我昨天也有同样的问题。我想到了这个问题,特别是如果存在类似“ON UPDATE CASCADE”的东西,那么很幸运,SQL的设计者也考虑过这个问题。我同意Ted.strauss,我也评论了Noran的案子。

我什么时候用的?就像Ted指出的那样,当你一次处理几个数据库,并且其中一个数据库中的修改,在一个表中,在Ted称之为“卫星数据库”时有任何类型的再现,不能与原始数据库保持一致ID,并且出于任何原因,您必须创建一个新ID,以防您无法更新旧数据(例如由于权限,或者如果您在如此短暂的情况下搜索坚牢度不应该完全和完全尊重规范化的总规则,仅仅因为它将是一个非常短暂的实用程序)

所以,我同意两点:

(A.)是的,很多时候更好的设计可以避免它; 但

(B.)在迁移,复制数据库或解决紧急情况的情况下,这是一个伟大的工具,幸运的是,当我去搜索它是否存在时。


查看完整回答
反对 回复 2019-08-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信