我经常使用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
的记录将被删除自动删除。这应该没问题。
这意味着当父级的
id
更新时,ON UPDATE CASCADE
会执行相同的操作?如果 (1) 为 true,则意味着如果
parent.id
不可更新(或永远不会更新),则无需使用ON UPDATE CASCADE
被更新),就像当它为AUTO_INCRMENT
或始终设置为TIMESTAMP
时一样。是这样吗?如果 (2) 不成立,在什么其他情况下我们应该使用
ON UPDATE CASCADE
?如果我(出于某种原因)将
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/