2016-03-14 178 views
0

我試圖用外鍵刪除架構中的某些信息時出現問題。 這裏是我的表使用外鍵刪除時從其他表中刪除

CREATE TABLE tb_class (class_ID INT PRIMARY KEY); 

CREATE TABLE tb_product (fingerprint VARCHAR(255) PRIMARY KEY); 

CREATE TABLE tb_class_product (class_ID INT, 
fingerprint VARCHAR(255), 
PRIMARY KEY (class_ID, fingerprint), 
UNIQUE INDEX tb_class_product_UNIQUE (fingerprint ASC), 
FOREIGN KEY (class_ID) REFERENCES tb_class(class_ID) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE, 
FOREIGN KEY (fingerprint) REFERENCES tb_product(fingerprint) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE); 

,當我在tb_class刪除類標識碼,我想,在tb_class_product信息和指紋tb_product被自動刪除。

我已經嘗試下面的觸發器添加到tb_class_product,但沒有成功

DELIMITER // 
CREATE TRIGGER tb_class_product_after_delete 
AFTER DELETE ON tb_class_product FOR EACH ROW 
BEGIN 
    DELETE FROM tb_product WHERE tb_product.fingerprint=old.fingerprint; 
END; // 
DELIMITER ; 

-------- --------編輯好的 。我發現級聯外鍵只刪除主鍵被刪除時的外鍵,但在刪除外鍵時不刪除主鍵。

此外,我發現當一個級聯外鍵被刪除時,觸發器不能運行。

現在我找到了適用於我的解決方案。

CREATE TABLE tb_class (class_ID INT PRIMARY KEY); 

CREATE TABLE tb_product (fingerprint VARCHAR(255) PRIMARY KEY); 

CREATE TABLE tb_class_product (class_ID INT, 
fingerprint VARCHAR(255), 
PRIMARY KEY (class_ID, fingerprint), 
UNIQUE INDEX tb_class_product_UNIQUE (fingerprint ASC), 
FOREIGN KEY (class_ID) REFERENCES tb_class(class_ID), 
FOREIGN KEY (fingerprint) REFERENCES tb_product(fingerprint)); 

DELIMITER // 
CREATE TRIGGER tb_class_product_before_delete 
BEFORE DELETE ON tb_class_product FOR EACH ROW 
BEGIN 
    IF @deleting_from_product IS NULL THEN 
     SET @deleting_from_class_product=1; 
     DELETE FROM tb_product WHERE tb_product.fingerprint=old.fingerprint; 
     SET @deleting_from_class_product=NULL; 
    END IF; 
END; // 
DELIMITER ; 

DELIMITER // 
CREATE TRIGGER tb_class_before_delete 
BEFORE DELETE tb_class FOR EACH ROW 
BEGIN 
    DELETE FROM tb_class_product WHERE tb_class_product.class_ID=old.class_ID; 
END; // 
DELIMITER ; 

DELIMITER // 
CREATE TRIGGER tb_product_before_delete 
BEFORE DELETE tb_product FOR EACH ROW 
BEGIN 
    IF @deleting_from_class_product IS NULL THEN 
     SET @deleting_from_product=1; 
     DELETE FROM tb_class_product WHERE tb_class_product.fingerprint=old.fingerprint: 
     SET @deleting_from_product=NULL; 
    END IF; 
END; // 
DELIMITER ; 
+0

'tb_class_product'沒有關於'tb_class'的任何信息 – 1000111

回答

0

以您所描述的方式聲明的索引,數據應自動從其他表中刪除。 你能否給出你正在使用的mysql版本,並說出刪除的效果是什麼 - 它會拋出一個錯誤嗎?

+0

我正在使用mySQL版本5.7並且delte不返回任何錯誤。 – Jubelius

+0

它不會拋出任何錯誤,也不會刪除所有相關記錄,只是刪除語句中的一條記錄?你從哪個表中刪除? – piotrgajow