2011-04-06 55 views
4

假設我有以下模式:逆轉的DELETE CASCADE

CREATE TABLE `users` (
    `id` int(10) unsigned auto_increment, 
    `historyId` varchar(255), 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `histories` (
    `id` int(10) unsigned auto_increment, 
    `history` TEXT, 
    PRIMARY KEY (`id`) 
); 

一個用戶永遠只能有一個歷史的,而不是具有歷史指向用戶的目的是,許多其他表(在此未提及模式)也有歷史。

什麼是最簡單的方式,使刪除用戶也會刪除其歷史?

回答

0

如果用戶的歷史是一個1-1的關係,你可以把約束users表中,而不是在「hisories」一個

+0

-1。引用這個問題:「沒有歷史記錄指向用戶的目的是許多其他表(在這個模式中沒有提到)也有歷史記錄。」 – Gili 2014-07-02 05:15:16

1

我不認爲你可以使用外鍵級聯刪除這裏,因爲數據類型不匹配。一個表中有VARCHAR(255),另一個表中有INT(10)。 (這是怎麼回事?)

我認爲你將不得不使用觸發器或存儲過程,這兩者都不完全令人滿意。觸發器在理論上是最安全的,因爲客戶端代碼不能偷偷摸摸地繞過它們。 (客戶端代碼可以避免調用存儲過程。)但有APIs that don't activate MySQL triggers

MySQL觸發器僅由SQL 語句激活。他們不是通過 不發送SQL語句 與MySQL服務器

2

使用觸發這樣的 的API所做的更改在表激活:

DELIMITER $$ 
CREATE TRIGGER delete_user_history_on_delete_user 
AFTER DELETE ON `users` 
FOR EACH ROW 
BEGIN 
DELETE FROM `histories` WHERE id = old.historyId; 
END$$ 
DELIMITER ; 
+0

MySQL文檔解釋了這一切。這是[鏈接](http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html)。 – devrique 2014-09-07 19:21:13