2017-06-06 69 views
1

我認爲這是一個常見問題,但我無法找到正確的關鍵字來執行搜索StackOverflow。如何處理關聯表和級聯約束在MYSQL

在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的比例不會被刪除。我不明白爲什麼。沒有人蔘考這個規模,這應該被刪除,否則,與大量的數據,很多「規模」將是orphean。

(同樣的事情發生,如果我不使用額外的表,我在組織中直接添加scale_id列)

+0

請向我們展示每個表的「SHOW CREATE TABLE scale」的輸出。你有沒有觸發器? – nCessity

回答

0

我認爲這個問題是這樣的:在organization_scale表只能在定義的ON DELTE CASCADE單向:刪除scaleorganization中的某些內容時,請勿刪除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; 
+0

不幸的是,這不起作用,因爲觸發器不是級聯觸發的。如果我有一個引用orgId的其他表,並且我從這個表中刪除,什麼都不會觸發 – Max

+0

哦!另一張桌子。這是重要的信息。請將其添加到您的問題。當然,我的代碼只適用於那些較小的表格。如果這是唯一的警告,你可以在該表上添加另一個觸發器,tho。 – nCessity