0

我不确定我是否在这里误解了一些基本的东西,但这里是:

I have a persons table (persons have the typical attributes for persons: names, address, etc.) and a table of elected representatives. 代表具有附加属性(例如,副代表/替代代表或他们自己可以替代的人)。由于我有很多人并且只有少数代表(n<200),因此我将所有人共有的所有属性存储在persons 表中,并且仅将代表特定数据存储在代表表中。代表中的所有“数据”都是与人员表的关系。该表仅反映了谁被批准投票(以及谁被批准替代他,或者他正在替代)的当前状态。

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;

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

  1. 是否有删除并忽略关系(只是删除行)-mysql的功能?

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

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;
4

2 回答 2

1

错误消息表明您具有with选项的persons.representative_id外键(默认值)。您可能想要改为删除代表并保留人员数据。representative.idON DELETE RESTRICTON DELETE SET NULL

或者,您可以将representative.person_id外键用作person.id.

于 2012-12-03T16:14:19.017 回答
0

我会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 表中的冗余 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 被更改(不是说它应该发生,而是以防万一),则更新将级联到两个表中的子表。

于 2012-12-03T16:28:28.213 回答