无法删除或更新父行:外键约束失败
在做:
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`);
然而,这是一个热点问题,所以它是在你自己的风险,因为这种方法的主要缺陷是以后需要手动保持数据完整性。