2011-06-14 56 views
0

我已經創建了兩個簡單的表來解釋這個問題。刪除MySQL中的父表

CREATE TABLE `child` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `father_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_22B354292055B9A2` (`father_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

CREATE TABLE `father` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

ALTER TABLE `child` 
    ADD CONSTRAINT `child_ibfk_1` FOREIGN KEY (`father_id`) REFERENCES `father` (`id`) 
    ON DELETE CASCADE; 

想象一下,子表中有通過外鍵鏈接到父表的行。

如果我在父表中刪除了一行中有行鏈接的行,我可以刪除它,因爲我已經激活了「ON DELETE CASCADE」。

的問題是,如果我嘗試刪除父表,即使沒有行既不是父親表中,也不在子表上,我收到以下錯誤信息(在phpMyAdmin):

#1217 - Cannot delete or update a parent row: a foreign key constraint fails 

我試過這個命令:

SET foreign_key_checks = 0; 

,但仍然出現相同的錯誤消息。

我可以刪除整個數據庫並重新創建它,但我不想這樣做,如果有另一個解決方案(如ON DELETE CASCADE的行)。

有什麼建議嗎?

回答

1

嘗試刪除約束本身。 alter table child drop foreign key child_ibfk_1;

+0

我想知道如何只用'DROP TABLE命令father'之所以這樣做,是因爲我想使用Symfony2的這個命令: 'PHP應用程序/控制檯學說:燈具:load' 哪在加載數據之前首先刷新數據庫。但是,由於相同的原因,它給了我與phpmyadmin相同的錯誤(唯一的區別是Symfony2命令使用截斷表)。我當然可以將外鍵放在子表中,但我想知道是否有自動執行的替代解決方案,例如行的ON DELETE CASCADE解決方案。 – rfc1484 2011-06-14 18:18:48

+1

我不相信有這樣的功能,至少不是我碰到過的。刪除行是對數據的更改,而刪除表則是對模式的更改。 – Jason 2011-06-14 18:21:49