【问题标题】:MySQL Foreign Key On Delete删除时的 MySQL 外键
【发布时间】:2012-01-10 02:57:28
【问题描述】:

我正在尝试找出关系和删除选项。

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

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

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

【问题讨论】:

  • 我猜你的意思是“删除所有 UserStaff 条目”,而不是“删除所有 UserStaff 表”

标签: mysql foreign-keys relationships


【解决方案1】:

是的,这是可能的。您应该在 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;

【讨论】:

  • 所以,我只是将UserStaff 表中的外键设置为“级联”然后,明白了!
【解决方案2】:

我已经有一段时间没有使用它了,但这里有(顺便说一句,我使用 Toad for MySql - 一个很棒的 IDE,而且它也是免费的 - http://www.toadworld.com/Freeware/ToadforMySQLFreeware/tabid/561/Default.aspx!)

您需要在 User 表中添加一个约束。如果您有一个 id 列(以及 UserStaff 中对应的外部 userid 键),那么 SouceColumn 应该是 id、目标表 UserStaff 和目标列 userid。然后您可以将 OnDelete 操作设置为“Cascade”

其他选项非常不言自明 - 将值限制为源列中的值,Set Null 将外键匹配设置为 Null 并且 No Action 会,呃,什么都没有。

通过 Toad IDE 很容易做到这一点。我使用 MySqlAdmin 工具很长时间了,但最近发现了 Toad(它也有差异和比较工具!)。

【讨论】:

    【解决方案3】:

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

    当您有一个表User 和一个表UserStaff 时,UserStaff 中的字段使用外键引用User 中的字段;那么如果您从UserStaff 中删除一条记录,该记录将被删除,而不会对User 表产生任何影响。反之,将删除与该记录相关的所有记录。

    短版:UserStaff 中的字段应使用 CASCADE 引用 User 中的字段

    【讨论】:

      【解决方案4】:

      UserStaff 表的外键上指定了ON DELETE CASCADE。有关外键的更多信息,MySQL documentation 有许多示例。 User 表没有指向UserStaff 的外键,因此不会受到UserStaff 表更改的影响。

      【讨论】:

        【解决方案5】:

        来自Wikipedia

        级联

        每当主(引用)表中的行被删除(相应更新)时,具有匹配外键列的子(引用)表的相应行也将被删除(相应更新)。这称为级联删除(resp. update[2])。

        这里,User 是主表,UserStaff 是子表。所以,是的,您需要在UserStaff 中创建外键,并使用ON DELETE CASCADE

        【讨论】:

          猜你喜欢
          • 2015-06-16
          • 1970-01-01
          • 2014-08-03
          • 1970-01-01
          • 2010-10-24
          • 2015-02-22
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          相关资源
          最近更新 更多