【问题标题】:How to design tables so delete queries on related tables will only remove relations between them?如何设计表以便删除相关表上的查询只会删除它们之间的关系?
【发布时间】:2015-02-25 09:38:52
【问题描述】:

我有teamsmember 表,它们由team_member 表连接。 teamsmember 具有多对多关系。当我删除团队时,我需要从 team_member 中删除所有关系对(团队 - 成员)并根据 teams 中的记录。我无法在team_member 表中设置ON DELETE CASCADE,因为它会删除成员(可能与许多团队相关)。删除成员的策略相同。最好的设计方法是什么?

当前设计:

CREATE TABLE `member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `organization` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `teams` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `rating` int(2) NOT NULL,
  `FK_Organization_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_Organization_id` (`FK_Organization_id`),
  CONSTRAINT `FK_Organization_id` FOREIGN KEY (`FK_Organization_id`) REFERENCES `organization` (`id`)
  ON CASCADE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

CREATE TABLE `team_member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `FK_Member_id` int(11) NOT NULL,
  `FK_Team_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_Member_id` (`FK_Member_id`),
  KEY `FK_Team_id` (`FK_Team_id`),
  CONSTRAINT `FK_Member_id` FOREIGN KEY (`FK_Member_id`) REFERENCES `member` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_Team_id` FOREIGN KEY (`FK_Team_id`) REFERENCES `teams` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我不能在 team_member 表中设置 ON DELETE CASCADE 因为它会 删除成员

    ON DELETE CASCADE 不能这样工作。以下两个外键约束将

    • 删除团队时级联删除到 team_member,并且
    • 删除成员时级联删除到 team_member。

    在任何情况下,删除团队都会从成员中删除行,在任何情况下,删除成员都不会同时从团队中删除行。

    CONSTRAINT `FK_Member_id` FOREIGN KEY (`FK_Member_id`) 
      REFERENCES `member` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
    CONSTRAINT `FK_Team_id` FOREIGN KEY (`FK_Team_id`) 
      REFERENCES `teams` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
    

    构建表格,添加一些行,然后自己进行测试。

    【讨论】:

      【解决方案2】:

      我认为你可以使用trigger

      delimiter $$
      create trigger trig_remove_members_from_team
      after delete on teams
      for each row
      begin
          delete from team_member where fk_team_id = OLD.id;
          -- You can perform additional insertions, updates or deletions
      end $$
      delimiter ;
      

      此触发器将在您从teams 中删除一行后立即执行。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2021-06-13
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2018-12-30
        • 1970-01-01
        相关资源
        最近更新 更多