我不确定我是否误解了这里的一些基本内容,但这里是:
我有一个人员表(人员具有人员的典型属性:姓名、地址等)和一个当选代表表。代表具有附加属性(例如副代表/替补代表或他们自己的替代者)。由于我有很多人,但只有几个代表(n<200),我将所有人共有的所有属性存储在人员表中,并且仅将代表特定的数据存储在代表表中。代表中的所有“数据”都是与人员表的关系。该表仅反射(reflect)了谁被允许投票(以及谁被允许替代他,或者他正在替代)的当前状态。
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;
最佳答案
错误消息表明您已将 persons.representative_id
作为 representative.id
的外键,并使用 ON DELETE RESTRICT
选项(默认) 。您可能需要ON DELETE SET NULL
,这样您就可以删除代表并保留人员数据。
或者,您可以将 representative.person_id
作为 person.id
的外键。
关于mysql - 从带有外键的表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687086/