我认为这是一个常见问题,但我无法找到正确的关键字来在 StackOverflow 上执行搜索。
在 mysql 中,我有两个实体:组织和规模。 一个组织只能有一个秤,但一个秤可以属于多个组织。
所以我创建了第三个实体 organization_scale。
例如:
organization
------------
org_id | name
1 | Mickey
2 | Donald
3 | Dingo
scale
----------
sc_id | name
1 | miniScale
2 | maxiScale
organization_scale
--------------
org_id | sc_id
1 | 1
2 | 1
3 | 2
organization_scale实体的两个字段都是外键+更新和删除级联
问题如下:
如果我从 org_id = 3 的组织中删除,则 organization_scale 的第三行被正确删除(因为 org_id = 3 不再存在)
但是
sc_id = 2 的比例不会被删除。我不明白为什么。没有人提到这个比例,这应该被删除,否则数据量很大,很多“比例”将是孤儿。
(如果我不使用额外的表,也会发生同样的事情,我直接在组织中添加一个 scale_id 列)
最佳答案
我认为问题在于:organization_scale
表定义中的 ON DELTE CASCADE
仅在一个方向上起作用:当删除 scale< 中的内容时
或 organization
然后不要询问并删除 organization_scale
中的行。
但您似乎想要另一个方向:当删除 organization_scale
中的内容时,如果不再引用它,请删除 scale
中的行。
这对我有用:我在 organization
上添加了一个触发器。
DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
USE test;
CREATE TABLE organization (org_id INT UNSIGNED PRIMARY KEY, name VARCHAR(255));
CREATE TABLE scale (sc_id INT UNSIGNED PRIMARY KEY, name VARCHAR(255));
CREATE TABLE organization_scale (org_id INT UNSIGNED, sc_id INT UNSIGNED,
FOREIGN KEY (org_id)
REFERENCES organization(org_id)
ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (sc_id)
REFERENCES scale(sc_id)
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TRIGGER delete_unused_sc_id AFTER DELETE ON organization FOR EACH ROW DELETE FROM scale WHERE NOT EXISTS (SELECT * FROM organization_scale WHERE organization_scale.sc_id = scale.sc_id);
INSERT INTO organization VALUES
(1,"Mickey"),
(2,"Donald"),
(3,"Dingo");
INSERT INTO scale VALUES
(1,"miniScale"),
(2,"maxiScale");
INSERT INTO organization_scale VALUES
(1,1),
(2,1),
(3,2);
SELECT * FROM organization_scale;
SELECT * FROM scale;
DELETE FROM organization WHERE org_id=3;
SELECT * FROM organization_scale;
SELECT * FROM scale;
DROP DATABASE test;
关于mysql - MYSQL中如何处理关联表和级联约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44399885/