2013-10-26 49 views
0

我有2個表:MySQL的外商鍵:由於認識RESTRICT和更新

1)kind_basis(兒童基礎數據)

id    bigint(20) unsigned  NO PRI  NULL auto_increment 
vorname   varchar(64)    NO   NULL 
nachname  varchar(64)    NO   NULL 
geburtsland_id bigint(20) unsigned  NO MUL  NULL 

2)liste_land(國家名單)

id    bigint(20) unsigned  NO PRI  NULL auto_increment 
iso    varchar(2)    NO   NULL 
landname  varchar(255)   NO   NULL 

它們之間有一個releation:

ALTER TABLE `kind_basis` 
    ADD CONSTRAINT `fk_geburtsland_id` 
    FOREIGN KEY (`geburtsland_id`) 
    REFERENCES `liste_land` (`id`) 
    ON DELETE RESTRICT 
    ON UPDATE CASCADE ; 

爲什麼下面的查詢是可能的嗎?

DELETE 
    FROM `liste_land` 
    WHERE `liste_land`.`id` = 6 

我不應該得到這樣的消息:「你可以不刪除該行,因爲它是在另一個表(kind_basis)使用?

如果我更新liste_land一排,將它被在kind_basis還更新了?

回答

2

ON DELETE RESTRICT意味着,如果這樣你可能不有子行子行引用值是家長,你不能刪除父行。

+0

什麼是家長,什麼是孩子在我的情況之上? – Gabriel

+0

子是外鍵的表,父是被引用的表(liste_land) – Mihai

+0

但是我可以成功刪除父表中的一行(liste_land),雖然有一個引用(從kind_basis - >刪除 - > restrict)。推理中的錯誤是什麼? – Gabriel

0

,而不是試圖刪除,因爲它把你正在使用所有數據的表放在一起,避免錯誤,避免打破頭腦,試圖破譯捏,或者乾脆爲什麼不嘗試使用另一個工具來開發這些表oracle,有mysqlWorkbench這是非常好的超級簡單,並在youtube上有很多視頻他的類,因爲我是相信你已經有創造的智慧和操作是容易的,我的小費invez嘗試刪除或更新將創建一個新的表已經實體和屬性,你需要不需要一直更新或刪除,然後將其導入到要

+0

關於「如果我更新了一個在liste_land中的行,它是否也會在kind_basis中更新?」,否。 –

+0

@DanBracuk:我應該怎麼做,來管理呢? – Gabriel

+0

這取決於更新。在你的榜樣,你正在尋找刪除父表的主鍵。這可能是不允許的,因爲外鍵很好。但是,如果只是更新另一個字段,子表中的記錄不會受到影響,但涉及這兩個表的查詢將從父表中返回新值。例如,如果你拼寫的國家名稱錯誤而且沒有注意到一段時間,這將派上用場。你可以簡單地在liste_land表中糾正它,並完成工作。 –