什么时候使用"ON UPDATE CASCADE"

24 浏览
0 Comments

什么时候使用"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 的父对象,则与 parent_id = parent.id 的子对象中的记录将自动删除。这应该不是问题。

  1. 这意味着当父级的 id 更新时,ON UPDATE CASCADE 会执行同样的操作吗?
  2. 如果(1)是正确的,那么如果 parent.id 不能更新(或永远不会被更新),比如当它是 AUTO_INCREMENT 或始终设置为 TIMESTAMP 时,就没有必要使用 ON UPDATE CASCADE了。 是这样吗?
  3. 如果(2)不正确,我们应该在什么其他情况下使用 ON UPDATE CASCADE
  4. 如果由于某种原因我将 child.parent_id 更新为不存在的值,它会自动删除吗?

我知道,上面的一些问题可以通过编程进行测试以了解,但我还想知道这是否取决于数据库供应商。

请给予一些启示。

admin 更改状态以发布 2023年5月21日
0
0 Comments
  1. 是的,这意味着如果你执行UPDATE parent SET id = 20 WHERE id = 10,所有父级id为10的子级parent_id也会被更新为20。

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

  3. 想不出其他用途。

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

0
0 Comments

确实,如果您的主键仅是一个自动增加的标识值,那么您就没有真正使用ON UPDATE CASCADE的用处。

然而,假设您的主键是一个十位数的UPC条形码,并且由于扩展,您需要将其更改为13位数的UPC条形码。在这种情况下,ON UPDATE CASCADE将允许您更改主键值以及任何具有对值的外键引用的表都将相应更改。

关于#4的参考,如果将子ID更改为在父表中不存在的内容(并且您具有引用完整性),则应出现外键错误。

0