sql - 何时使用 "ON UPDATE CASCADE"

标签 sql foreign-keys

我经常使用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) 为 true,则意味着如果 parent.id 不可更新(或永远不会更新),则无需使用 ON UPDATE CASCADE被更新),就像当它为 AUTO_INCRMENT 或始终设置为 TIMESTAMP 时一样。是这样吗?

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

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

嗯,我知道,上面的一些问题可以通过编程方式测试来理解,但我还想知道其中是否有数据库供应商相关。

请透露一些信息。

最佳答案

确实,如果您的主键只是一个自动递增的身份值,那么 ON UPDATE CASCADE 就没有实际用途。

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

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

关于sql - 何时使用 "ON UPDATE CASCADE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481476/

相关文章:

mysql - mySQL/SQL 中的 count(0)、count(1).. 和 count(*) 有什么区别?

sql - mySQL order by clause奇怪的问题

python - django中是否有一个字段可以有多个外键字段?

sql - 如何选择提交次数超过 10 次的所有用户

mysql - 如何对mysql中显示的内容进行升序或降序显示

php - 无法将数组绑定(bind)到 CDbCriteria (Yii)

postgresql - "polymorphism"用于 FOREIGN KEY 约束

mysql - 如果可以使用 WHERE,为什么还需要使用外键?

mysql - 使用外键时无法在 MySQL [错误 150] 中创建表

mysql - 从mysql中的表中删除外键