2011-04-06 96 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