使用foreign_key_checks = 0将带有外键的表删除失败

时间:2018-03-27 11:43:30

标签: mysql

当其他表有外键时,我需要运行drop table pages

CREATE TABLE `pages` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uri` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `pages_domain_unique` (`domain`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 

引用表:

CREATE TABLE `link_data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `page_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `link_data_page_id_foreign` (`page_id`),
  CONSTRAINT `link_data_page_id_foreign` FOREIGN KEY (`page_id`) REFERENCES `pages` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

剧本......

SET foreign_key_checks = 0;
drop table drop table pages; --// the row I am failing with.
ALTER TABLE link_dataDROP FOREIGN KEY link_data_page_id_foreign;
ALTER TABLE link_data DROP COLUMN page_id;

SET foreign_key_checks = 1;

我需要在删除引用字段之前删除表页面。 (复杂的问题,不要为什么)。

为什么foreign_key_checks=0在这种情况下不起作用?

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: DROP TABLE PAG
  ES ;)更新  问题更多的是为什么foreign_key_checks=0不会影响脚本。如何解决它的简单,只是以不同的方式优先考虑脚本。

由于

1 个答案:

答案 0 :(得分:1)

您是否尝试过设置级联选项?

 CONSTRAINT `link_data_page_id_foreign` FOREIGN KEY (`page_id`) REFERENCES `pages` (`id`)
   ON DELETE CASCADE
   ON UPDATE CASCADE

如果没有,请尝试将约束声明为可延迟。删除寄存器本身时,请设置延迟模式,然后再返回。

如果您使用的是phpMyAdmin,请转到Variables部分并停用foreign key checks以查看是否有效。