使用外键从表中删除

时间:2012-12-03 16:03:17

标签: mysql foreign-keys delete-row

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

我有一张人员表(人员具有典型的人员属性:姓名,地址等)和一份当选代表。代表有其他属性(例如代理人/替代代表或他们自己代替的人)。由于我有很多人并且只有少数代表(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;

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

  1. 是否有 DELETE FROM并忽略mysql的关系(只删除行)-function

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

  3. 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;
    

2 个答案:

答案 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被改变(不是它应该发生,只是为了以防万一),更新将在两个表中的子节点上级联。