无法删除或更新父行:外键约束失败

在做:

DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1 

它错误:

 #1451 - Cannot delete or update a parent row: a foreign key constraint fails (paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY (advertiser_id) REFERENCES jobs (advertiser_id)) 

这是我的表格:

 CREATE TABLE IF NOT EXISTS `advertisers` ( `advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `password` char(32) NOT NULL, `email` varchar(128) NOT NULL, `address` varchar(255) NOT NULL, `phone` varchar(255) NOT NULL, `fax` varchar(255) NOT NULL, `session_token` char(30) NOT NULL, PRIMARY KEY (`advertiser_id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES (1, 'TEST COMPANY', '', '', '', '', '', ''); CREATE TABLE IF NOT EXISTS `jobs` ( `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `advertiser_id` int(11) unsigned NOT NULL, `name` varchar(255) NOT NULL, `shortdesc` varchar(255) NOT NULL, `longdesc` text NOT NULL, `address` varchar(255) NOT NULL, `time_added` int(11) NOT NULL, `active` tinyint(1) NOT NULL, `moderated` tinyint(1) NOT NULL, PRIMARY KEY (`job_id`), KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES (1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0); ALTER TABLE `advertisers` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`); 

因此,您必须删除广告客户表中的行,然后才能删除所引用的作业表中的行。 这个:

 ALTER TABLE `advertisers` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`); 

实际上和它应该是相反的。 事实上,这意味着您必须在广告客户面前创build一个工作表中的logging。 所以你需要使用:

 ALTER TABLE `jobs` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`); 

一旦你纠正了外键关系,你的删除语句就会起作用。

简单的方法是禁用外键检查; 进行更改,然后重新启用外键检查。

 SET FOREIGN_KEY_CHECKS=0; -- to disable them SET FOREIGN_KEY_CHECKS=1; -- to re-enable them 

在您当前(可能有缺陷)的devise下,您必须删除广告客户表中的行, 然后才能删除其引用的作业表中的行。

或者,您可以设置外键,使父表中的删除操作可以自动删除子表中的行。 这被称为级联删除。 它看起来像这样:

 ALTER TABLE `advertisers` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`) ON DELETE CASCADE; 

话虽如此,正如其他人已经指出的,你的外键感觉应该是相反的,因为广告主表真正包含主键,而作业表包含外键。 我会重写这样的:

 ALTER TABLE `jobs` ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`); 

级联删除将不是必需的。

我认为你的外键是倒退的。 尝试:

 ALTER TABLE 'jobs' ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`) 

如果你想删除一个表,你应该在一个步骤中执行下面的查询

SET FOREIGN_KEY_CHECKS = 0; DROP TABLE table_name;

如果有多个工作具有相同的advertiser_id,那么您的外键应该是:

 ALTER TABLE `jobs` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`); 

否则(如果你的情况相反),如果你想要广告客户中的行被自动删除,如果作业中的行被删除,请在外键上添加“ON DELETE CASCADE”选项

 ALTER TABLE `advertisers` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`); ON DELETE CASCASE 

检查外键约束

当你创build数据库或创build表

您应该在顶部脚本创build数据库或表中添加该行

 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1; 

现在你想从表中删除logging? 那么你写作为

 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1; DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1 

祝你好运!

如何这个替代我一直在使用:允许外键为NULL ,然后selectON DELETE SET NULL

就个人而言,我更喜欢使用“ ON UPDATE CASCADE ”以及“ ON DELETE SET NULL ”以避免不必要的复杂性,但在设置时可能需要不同的方法。 另外,如果你不知道在这里发生了什么,那么将外键值填零会导致复杂性。 所以这个改变应该与你的应用程序代码的工作方式密切相关。

希望这可以帮助。

我也在laravel迁移遇到了这个问题
down()方法中的drop表的顺序很重要

 Schema::dropIfExists('groups'); Schema::dropIfExists('contact'); 

可能无法正常工作,但如果您更改了订单,则可以使用。

 Schema::dropIfExists('contact'); Schema::dropIfExists('groups'); 

也许你应该试试DELETE CASCADE

您需要按顺序将其删除表中存在依赖关系

如果您需要尽快支持客户端,并且无法访问

 FOREIGN_KEY_CHECKS 

以便可以禁用数据完整性:

1)删除外键

 ALTER TABLE `advertisers` DROP FOREIGN KEY `advertisers_ibfk_1`; 

2)激活您的删除操作thruogh sql或api

3)将外键添加回模式

 ALTER TABLE `advertisers` ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`); 

然而,这是一个热点问题,所以它是在你自己的风险,因为这种方法的主要缺陷是以后需要手动保持数据完整性。