ON DELETE CASCADE的反转

时间:2011-04-06 00:26:40

标签: mysql sql database database-design

假设我有以下架构:

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`)
);

用户只有一个历史记录,没有历史记录指向用户的目的是许多其他表(此模式中未提及)也有历史记录。

最简单的方法是删除用户还会删除其历史记录吗?

3 个答案:

答案 0 :(得分:4)

你可以使用这样的触发器:

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 ;

答案 1 :(得分:1)

我认为你不能在这里使用外键来级联删除,因为数据类型不匹配。一个表中有VARCHAR(255),另一个表中有INT(10)。 (那是怎么回事?)

我认为你必须使用触发器或存储过程,这两者都不是完全令人满意的。触发器在理论上是最安全的,因为客户端代码不能潜行它们。 (客户端代码可以避免调用存储过程。)但是有APIs that don't activate MySQL triggers

  

MySQL触发器由SQL激活   只有陈述。他们不是   由表格的变化激活   不传输SQL的API   MySQL服务器的语句

答案 2 :(得分:0)

如果用户历史是1-1关系,你可以将约束放在用户表中,而不是放在'hisories'中