2012-12-03 59 views
0

我不能確定我已經在這裏誤解了一些基本的東西,但在這裏有雲:從表中刪除與外鍵

我有一個個人表(個人對個人的典型屬性:名稱,地址等)和一個民選代表表格。代表有其他屬性(例如副代表/替代代表或他們自己替代的人)。由於我有很多人,只有幾個代表(< 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?

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

你可以發表涉及所有表的'CREATE TABLE'語句嗎? –

+0

我會用這個信息更新這個問題。 – Eiriks

+0

查看該鏈接http://stackoverflow.com/questions/6720050/foreign-key-constraints-when-to-use-on-update-and-on-delete/6720458#6720458瞭解關於外鍵參數的詳細信息 – regilero

回答

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; 

我也不會在代表表使用冗餘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; 

這樣,當一個代表被刪除,他們所有的人constutuent rep_id列被更新爲NULL,和他們在同一個表潛艇被刪除。如果rep_id被改變(不是它應該發生,但是爲了以防萬一),更新在兩個表中的子級上被級聯。

1

該錯誤信息顯示你有persons.representative_id爲外鍵representative.idON DELETE RESTRICT選項(默認)。您可能需要ON DELETE SET NULL,以便您可以刪除代表並保留個人數據。

或者,您可以將representative.person_id作爲外鍵,轉向person.id