我试图找出关系和删除选项。
我有两个表User
和UserStaff
,从User
到UserStaff
的关系为1:n(用户可以有多个工作人员)。
删除User
后,我想删除与该UserStaff
相关联的所有User
表。删除UserStaff
后,我不希望User
发生任何事情。我知道这是一种级联关系,但我不确定哪种方式。
即。我是否在UserStaff
表中选择现有外键并使其级联,或者在User
中创建新外键并将其设置为级联?
答案 0 :(得分:20)
是的,这是可能的。您应该在UserStaff表中创建FK。这样:
用户表
CREATE TABLE `User` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
UserStaff表
CREATE TABLE `UserStaff` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`UserId` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`),
KEY `UserId` (`UserId`),
CONSTRAINT `UserStaff_ibfk_1`
FOREIGN KEY (`UserId`)
REFERENCES `User` (`Id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
答案 1 :(得分:7)
来自Wikipedia:
<强> CASCADE 强>
每当删除(引用)表中的主(引用)表中的行时,具有匹配外键列的子(引用)表的相应行也将被删除(分别更新)。这称为级联删除(resp.update [2])。
此处,User
是主表,UserStaff
是子表。所以,是的,您需要在UserStaff
中使用ON DELETE CASCADE
答案 2 :(得分:3)
在UserStaff
表中的外键上指定了ON DELETE CASCADE。有关外键的其他信息,MySQL documentation有许多示例。 User
表没有指向UserStaff
的外键,因此它不会受到UserStaff
表更改的影响。
答案 3 :(得分:2)
自从我使用它已经有一段时间了,但是这里(顺便说一句,我使用Toad for MySql - 一个很好的IDE,它也是免费的 - http://www.toadworld.com/Freeware/ToadforMySQLFreeware/tabid/561/Default.aspx!)
您需要向User表添加约束。如果您有一个id列(以及UserStaff中相应的外部用户标识键),那么SouceColumn应该是id,目标表UserStaff和目标列userid。然后,您可以将OnDelete操作设置为“Cascade”
其他选项非常明显 - 将限制值限制为源列中的值,Set Null将外键匹配设置为Null而No Action设置为,呃,没有。
通过Toad IDE很容易做到这一点。我使用了MySqlAdmin工具很久但最近发现了Toad(它也有差异和比较工具!)。
答案 4 :(得分:2)
最简单的方法可能是制作两张快速表并进行试用。但既然你没有,我可以告诉你,结果将是它按照你想要的方式工作。
当您有一个表User
和一个表UserStaff
时,UserStaff
中的字段使用外键来引用User
中的字段;然后,如果您从UserStaff
中删除了一条记录,该记录将被删除而对User
表格没有任何影响。反过来将删除与该记录相关的所有记录。
简短版本:UserStaff
中的字段应使用CASCADE
User
中的字段