使用外键从表中删除

Posted

技术标签:

【中文标题】使用外键从表中删除【英文标题】:Deleting from table with foreign keys 【发布时间】:2012-11-21 03:29:06 【问题描述】:

我不确定我是否误解了这里的基本内容,但这里是:

I have a persons table (persons have the typical attributes for persons: names, address, etc.) and a table of elected representatives.代表具有其他属性(例如,副代表/替代代表或他们自己可以替代的人)。因为我有很多人,只有少数代表(n

representatives 
(numbers are the pk for persons, and empty cells here are NULL in the db)
_____________________________
|id|has_substitute|is_sub_for|
| 1|           2  |          |
| 2|              |        1 |
| 3|              |          |
| 5|              |          |

所以有一天,代表被剥夺了投票权,我需要将他从代表中删除,但不在人员表中(他仍然是一个人)。他是替补的人,或者曾经是他替补的人也是如此。它们在我的模式中是 FK,但我不想将它们作为人删除,只是与出去的代表的关系。只是代表表中的行。

DELETE FROM representatives WHERE id=1;

一切都错了。 '无法删除或更新父行:外键约束失败' 但我不打算删除人员,只是用“代表”表创建的关系。

    mysql 是否有DELETE FROM 并忽略关系(只删除行)-函数

    我的建模错了吗?如果是这样,有什么更好的方法?

PS:这里是创建表信息

CREATE TABLE `representatives` (
  `person_id` varchar(33) NOT NULL,
  `permanent_substitute_for_id` varchar(33) DEFAULT NULL,
  `temporarily_substitute_for_id` varchar(33) DEFAULT NULL,
  PRIMARY KEY (`person_id`),
  KEY `representatives_250f5a24` (`permanent_substitute_for_id`),
  KEY `representatives_79c95594` (`temporarily_substitute_for_id`),
  CONSTRAINT `permanent_substitute_for_id_5c64807b` FOREIGN KEY (`permanent_substitute_for_id`) REFERENCES `persons` (`id`),
  CONSTRAINT `person_id_refs_id_5c64807b` FOREIGN KEY (`person_id`) REFERENCES `persones` (`id`),
  CONSTRAINT `temporarily_substitute_for_id_5c64807b` FOREIGN KEY (`temporarily_substitute_for_id`) REFERENCES `persones` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `persones` (
  `id` varchar(33) NOT NULL,
  `first_name` varchar(150) NOT NULL,
  ..[more stuff]..
  PRIMARY KEY (`id`),
  KEY `fylkesperspektiv_personer_70fdfe4` (`fylke_id`),
  KEY `fylkesperspektiv_personer_3ab19c51` (`parti_id`),
  CONSTRAINT `fylke_id_refs_id_36bce012` FOREIGN KEY (`fylke_id`) REFERENCES `fylkesperspektiv_fylker` (`id`),
  CONSTRAINT `parti_id_refs_id_c381e045` FOREIGN KEY (`parti_id`) REFERENCES `fylkesperspektiv_partier` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

你可以为所有涉及的表发布CREATE TABLE 声明吗? 我将使用此信息更新问题。 查看链接***.com/questions/6720050/…了解外键参数的详细信息 【参考方案1】:

错误消息表明您将persons.representative_id 作为representative.id 的外键,并带有ON DELETE RESTRICT 选项(默认值)。您可能需要ON DELETE SET NULL,这样您就可以删除代表并保留人员数据。

或者,您可以将representative.person_id 作为person.id 的外键。

【讨论】:

【参考方案2】:

我会为每个人定义一个rep_id 列并将其与rep 表联系起来:

ALTER TABLE person
    ADD CONSTRAINT FK_person_rep
    FOREIGN KEY (rep_id) REFERENCES rep(rep_id)
    ON UPDATE CASCADE ON DELETE SET NULL;

我也不会使用 rep 表中的 redundant has_substitute 列,而只使用 is_sub_for,然后将其绑定到同一张表中的 rep_id

ALTER TABLE rep
ADD CONSTRAINT FK_rep_rep
FOREIGN KEY (is_sub_for) REFERENCES rep(rep_id)
ON DELETE CASCADE ON UPDATE CASCADE;

这样,当一个代表被删除时,他们所有的成员的 rep_id 列都被更新为 NULL,并且他们在同一个表中的 subs 被删除。如果 rep_id 发生了变化(不应该发生,但以防万一),更新会级联到两个表中的子表。

【讨论】:

以上是关于使用外键从表中删除的主要内容,如果未能解决你的问题,请参考以下文章

给springmvc接口快速增加字段检索,外键从表检索,外键从表查询的searchdb注解

给springmvc接口快速增加字段检索,外键从表检索,外键从表查询的searchdb注解

EF Code-First如何使用复合键从表中读取A.

如何使用外键从 2 个表中获取所有数据

错误:删除表违反外键约束。密钥 id 仍然从表中引用(很多)

如何使用外键从Django的其他表中获取数据(Django的新手)