2011-06-14 182 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