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

sql:

delete d,m,z from tab_lightrate_day d , tab_lightrate_month m ,tab_zone z where d.zoneId = z.id and z.id = m.zoneId
and  z.id =101

出现如下提示:

Cannot delete or update a parent row: a foreign key constraint fails (`db_lms`.`tab_lightrate_day`, CONSTRAINT `tab_lightrate_day_ibfk_1` FOREIGN KEY (`zoneId`) REFERENCES `tab_zone` (`id`))//外键约束,删不掉

于是乎就网上到处搜索资料:

浏览了大片资料后,最后在百度文库中找到了灵感。操作:

1、首先用 show create table 表名 查到了 操作的三张表的建表语句:

A、tab_zone

CREATE TABLE `tab_zone` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=gb2312

B、tab_lightrate_day

CREATE TABLE `tab_lightrate_day` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `zoneId` int(5) NOT NULL,
  `sampleTime` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `zoneId` (`zoneId`) USING BTREE,
  CONSTRAINT `tab_lightrate_day_ibfk_1` FOREIGN KEY (`zoneId`) REFERENCES `tab_zone` (`id`)//定义了外键约束,但是没有定义级联删除
) ENGINE=InnoDB AUTO_INCREMENT=1009 DEFAULT CHARSET=utf8

C、tab_lightrate_month

CREATE TABLE `tab_lightrate_month` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `zoneId` int(5) NOT NULL,
  `month` varchar(10) NOT NULL,
  `lightRate` decimal(4,1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `zoneId` (`zoneId`) USING BTREE,
  CONSTRAINT `tab_lightrate_month_ibfk_1` FOREIGN KEY (`zoneId`) REFERENCES `tab_zone` (`id`)//同样也定义了外键约束,但是没有 级联删除定义
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8

通过以上三张表的建表语句看出,从表tab_lightrate_month,tab_lightrate_day 都定义了外键约束,单灯没有定义级联删除。所以当我再操作时 就出现本文开始的提示信息。

下一步就是解决办法了,从百度文库中找到了解决办法:

1、首先删除tab_lightrate_day 之前的外键约束:

alter table tab_lightrate_day drop foreign key tab_lightrate_day_ibfk_1

2、然后重新添加新的外键约束(增加了级联删除)

alter table tab_lightrate_day add foreign key(zoneId) REFERENCES `tab_zone` (`id`) on delete cascade

3、对表tab_lightrate_month  也做同样的操作

alter table tab_lightrate_month drop foreign key tab_lightrate_month_ibfk_1
alter table tab_lightrate_month add foreign key(zoneId) REFERENCES `tab_zone` (`id`) on delete cascade

4、最后测试:

delete from tab_zone where id=101

   级联删除成功!!

本文出自 “学习交流小屋” 博客,转载请与作者联系!

你可能感兴趣的:(mysql,级联删除)