我不确定我是否在这里误解了一些基本的东西,但是这里有:
我有一张人员表(人员具有典型的人员属性:姓名,地址等)和一份当选代表。代表有其他属性(例如代理人/替代代表或他们自己代替的人)。由于我有很多人并且只有少数代表(n <200),因此我在人员表中存储了所有人共同的所有属性,并且只存储了代表表中的代表特定数据。代表中的所有“数据”都是与人员表的关系。该表仅反映了谁被清除投票的当前状态(谁被清除以代替他,或者他正在替换)。
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;
出错了。 '无法删除或更新父行:外键约束失败' 但我不打算删除这些人,只是删除与“代表”表创建的关系。
是否有 DELETE FROM并忽略mysql的关系(只删除行)-function ?
我建模错了吗?如果是这样,那会是更好的方法吗?
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;
答案 0 :(得分:1)
错误消息表明您已将persons.representative_id
作为representative.id
的外键,并带有ON DELETE RESTRICT
选项(默认值)。您可能需要ON DELETE SET NULL
,以便您能够移除代表并保留个人数据。
或者,您可以将representative.person_id
作为person.id
的外键。
答案 1 :(得分: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被删除时,他们的所有constantuent人员的rep_id列都会被更新为NULL,同时删除他们在同一个表中的subs。如果一个rep_id被改变(不是它应该发生,只是为了以防万一),更新将在两个表中的子节点上级联。