首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向ON DELETE CASCADE

反向ON DELETE CASCADE
EN

Stack Overflow用户
提问于 2011-04-06 08:26:40
回答 3查看 2.7K关注 0票数 7

假设我有以下模式:

代码语言:javascript
复制
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`)
);

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

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

EN

回答 3

Stack Overflow用户

发布于 2011-04-08 12:26:00

您可以像这样使用触发器:

代码语言:javascript
复制
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 ;
票数 5
EN

Stack Overflow用户

发布于 2011-04-06 16:43:43

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

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

MySQL触发器仅由SQL语句激活。它们不会通过不将SQL语句传输到MySQL服务器

的API所做的表更改来激活

票数 1
EN

Stack Overflow用户

发布于 2011-04-06 08:28:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5560172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档