MySQL外键删除

时间:2011-11-30 21:39:20

标签: mysql foreign-keys relationships

我试图找出关系和删除选项。

我有两个表UserUserStaff,从UserUserStaff的关系为1:n(用户可以有多个工作人员)。

删除User后,我想删除与该UserStaff相关联的所有User表。删除UserStaff后,我不希望User发生任何事情。我知道这是一种级联关系,但我不确定哪种方式。

即。我是否在UserStaff表中选择现有外键并使其级联,或者在User中创建新外键并将其设置为级联?

5 个答案:

答案 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工具很久但最近发现了Toa​​d(它也有差异和比较工具!)。

答案 4 :(得分:2)

最简单的方法可能是制作两张快速表并进行试用。但既然你没有,我可以告诉你,结果将是它按照你想要的方式工作。

当您有一个表User和一个表UserStaff时,UserStaff中的字段使用外键来引用User中的字段;然后,如果您从UserStaff中删除了一条记录,该记录将被删除而对User表格没有任何影响。反过来将删除与该记录相关的所有记录。

简短版本UserStaff中的字段应使用CASCADE

引用User中的字段