mysql - 从带有外键的表中删除

标签 mysql foreign-keys delete-row

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

我有一个人员表(人员具有人员的典型属性:姓名、地址等)和一个当选代表表。代表具有附加属性(例如副代表/替补代表或他们自己的替代者)。由于我有很多人,但只有几个代表(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;

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

  1. mysql有DELETE FROM并忽略关系(仅删除行)功能吗?

  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;

最佳答案

错误消息表明您已将 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/

相关文章:

Mysql 将列从 'allow null' 更改为 'not null' 并设置值

mysql - Rails 表索引不是预期的数据库中的外键 - 为什么?

ios - UITableView-删除部分中的最后一个单元格

android - 从 ListView 中删除数据

mysql - INSERT 更改 auto_increment,但 UPDATE 不更改 auto_increment?

php - 将整数转换为数组

Mysql:如何在 1 行中向现有表添加唯一列?

MySQL:我应该把外键放在哪里?

mysql - 使用某些 ID 子句从 MYSQL DB 的所有表中删除所有行

javascript - 为什么SQL返回的字符串长度和其他语言返回的字符串长度不一样?