【发布时间】:2021-10-29 14:34:19
【问题描述】:
相关问题:Foreign key constraints: When to use ON UPDATE and ON DELETE。
我们举个例子,一个公司表和一个用户表,其中包含来自这些公司的人
CREATE TABLE COMPANY (
company_id INT NOT NULL,
company_name VARCHAR(50),
PRIMARY KEY (company_id)
) ENGINE=INNODB;
CREATE TABLE USER (
user_id INT,
user_name VARCHAR(50),
company_id INT,
INDEX company_id_idx (company_id),
FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
) ENGINE=INNODB;
ON DELETE CASCADE:危险:如果您删除表 COMPANY 中的公司行,引擎也会删除相关的 USER。这很危险,但可用于对辅助表进行自动清理(因此它可以是您想要的,但肯定不是 COMPANYUSER 示例)
现在,假设我有多家公司,每家公司都有多个客户。我习惯在每个表上都有一个主自动索引键,并将其用作子表的外键。
那么,既然我的company_id 是自动生成的并且保证是唯一的,那么我将用户表中的外键company_id 设置为onDelete=cascade 有什么危险吗?
显然,我的 GUI 有很多“你确定你确定你真的要删除它吗?操作无法撤消!”
但是,如果我不 onDelete=cascade,那么在我可以DELETE FROM companies WHERE company_id=X 之前,我首先必须DELETE FROM users WHERE company_id=X,这是我一直在做的事情。
我第一次考虑 onDelete=cascade 只是想确定我已经理解了它。当依赖关系树有多个层次时,删除依赖行可能会变得乏味。
另外,由于键是自动索引,它们不会改变,所以我看不出我需要 onUpdate。
[更新] 一个答案是关于删除业务数据。这只是相关问题中的一个示例。
想象一下架构:一个用户可以有多个站点的平面图,每个站点有多个建筑物,每个有多个楼层,每个有多个房间。
它是一个级联的、树状的层次结构。在那里有 onDelete=Cascade 有意义吗?我想是的,但想听听那些更有知识的人的意见
【问题讨论】:
标签: mysql foreign-keys