mysql - MYSQL中如何处理关联表和级联约束

标签 mysql foreign-keys relational-database

我认为这是一个常见问题,但我无法找到正确的关键字来在 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/

相关文章:

mysql - 使用一个引用字段来实现多个外键约束有什么可能

php - 当当前值和新值相同时,更新查询将受影响的行返回为 0

mysql - 为什么使用 IN(子查询)的查询比使用 IN(离散列表)的查询花费的时间更长

sqlite - 外键约束不适用

mysql - MySQL.Cluster (NDB) 的外键

php - Laravel Eloquent 扩展模型

php - 无法根据 PHP 和 MySQL 中的另一个表(关系数据库)从表中选择所有结果

sql - 需要有关汽车公司 ER 图的帮助

PHP PDO - 无效参数编号 : parameter was not defined when using RLIKE

PHP:需要服务器时间和日期来运行 SQL 查询