我不确定我是否在这里误解了一些基本的东西,但这里是:
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;
一切都错了。“无法删除或更新父行:外键约束失败” 但我不打算删除人员,只是用“代表”表创建的关系。
是否有删除并忽略关系(只是删除行)-mysql的功能?
我建模错了吗?如果是这样,有什么更好的方法?
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;