转载地址:http://lijiejava.iteye.com/blog/790478

有两张表,结构如下:

  1. t_item:                          t_bid:
  2. id        int                     id        int
  3. name    varchar                   name      varchar
  4. item_id   int

其中表t_item的主键id是表t_bid的item_id字段的外键。那么在这种情况下,如果删除表t_item中的记录,并且该记录中的id主键被t_bid中的item_id字段所引用,就会抛出如下异常:

  1. ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test/t_bid`, CONSTRAINT `fk_id` FOREIGN KEY (`id`) REFERENCES `t_item
  2. ` (`id`))

解决方法:级联删除,即在删除t_item表中的记录时同时删除t_bid表中的相关记录

(1) 增加外键约束时声明级联删除,即:

  1. alter table t_bid add constraint fk_id foreign key(id) references
  2. key(id) on delete cascade;

(2) 使用触发器:在删除t_item表中记录之前先删除与之相关的t_bid表中的记录。

     触发器代码(MySQL):

  1. delimiter //
  2. create trigger tri_delete before delete on t_item
  3. for each row
  4. begin
  5. delete from t_bid where id = old.id;
  6. end //

Hibernate中的解决方案:

这个问题在Hibernate中相对容易解决,只需设置cascade = “delete”即可。此时观察发出的sql语句:

  1. Hibernate: select item0_.id as id0_0_, item0_.name as name0_0_ from t_item item0_ where item0_.id=?
  2. Hibernate: select bids0_.item_id as item3_1_, bids0_.id as id1_, bids0_.id as id1_0_, bids0_.price as price1_0_, bids0_.item_id as item3_1_0_ from t_bid bids0_ where bids0_.item_id=?
  3. Hibernate: update t_bid set item_id=null where item_id=?
  4. Hibernate: delete from t_bid where id=?
  5. Hibernate: delete from t_bid where id=?
  6. Hibernate: delete from t_item where id=?

发现在删除t_bid表中记录之前会先将它的item_id字段值设置为null,但如果我们在映射文件中设置item_id字段不能为null,即设置Bid.hbm.xml文件为:

  1. <many-to-one name="item" column="item_id" class="po.Item" not-null="true"/>

注意不能在Item.hbm.xml文件中进行如下设置(即在key元素中指定not-null="true"):

  1. <set name="bids" cascade="all">
  2. <key column="item_id" not-null="true"/>
  3. <one-to-many class="po.Bid"/>
  4. </set>

这样会抛出"Repeated column in mapping for entity"异常http://www.iteye.com/topic/786535

如果我们指定item_id字段值不能为null,那么在删除时会抛出如下异常:

  1. org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update···
  2. Caused by: java.sql.BatchUpdateException: Data truncation: Column set to default value; NULL supplied to NOT NULL column 'item_id' at row 1
  3. •••

此时的解决方法是设置inverse="true",这在Hibernate文档中有相应的描述:

  1. Very Important Note: If the <key> column of a <one-to-many> association is declared NOT NULL, Hibernate may cause constraint violations when it creates or updates the association. To prevent this problem, you must use a bidirectional association with the many valued end (the set or bag) marked as inverse="true".

观察此时发出的sql语句:

  1. Hibernate: select item0_.id as id1_0_, item0_.name as name1_0_ from t_item item0_ where item0_.id=?
  2. Hibernate: select bids0_.item_id as item3_1_, bids0_.id as id1_, bids0_.id as id0_0_, bids0_.amount as amount0_0_, bids0_.item_id as item3_0_0_ from t_bid bids0_ where bids0_.item_id=?
  3. Hibernate: delete from t_bid where id=?
  4. Hibernate: delete from t_bid where id=?
  5. Hibernate: delete from t_item where id=?

没有发出update语句。关于inverse="true"的理解:http://lijiejava.iteye.com/blog/776587

【转】表删除时 Cannot delete or update a parent row: a foreign key constraint fails 异常处理的更多相关文章

  1. 表删除时 Cannot delete or update a parent row: a foreign key constraint fails 异常处理

    有两张表,结构如下: t_item:                          t_bid: id        int                     id        int n ...

  2. Mysql - 删除表时出现: Cannot delete or update a parent row: a foreign key constraint fails

    现象 MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint ...

  3. Hibernate级联删除时:Cannot delete or update a parent row: a foreign key constraint fails异常

    在删除主表数据时,报了一个异常 Cannot delete or update a parent row: a foreign key constraint fails 原因是主表中还包含字表的数据, ...

  4. mysql删除有外链索引数据,Cannot delete or update a parent row: a foreign key constraint fails 问题的解决办法

    mysql删除有外链索引数据Cannot delete or update a parent row: a foreign key constraint fails 问题的解决办法查询:DELETE ...

  5. mysql 在删除数据出现Cannot delete or update a parent row: a foreign key constraint fails 这个该如何解决

    mysql 在删除数据出现Cannot delete or update a parent row: a foreign key constraint fails  这个该如何解决 可以这样解决: S ...

  6. MySQL:ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

    MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fa ...

  7. Mysql之1451 - Cannot delete or update a parent row: a foreign key constraint fails...解决办法记录

    今天使用delete语句删除一张表中的一条信息时,提示了这么一个错误:1451 - Cannot delete or update a parent row: a foreign key constr ...

  8. ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

    mysql 删除表时提示有外键 mysql> drop tables auth_group;ERROR 1217 (23000): Cannot delete or update a paren ...

  9. MySQL主从复制中断,报“Error on master: message (format)='Cannot delete or update a parent row: a foreign key constraint fails' error code=1217” 错误

    前几天,发现从库挂了,具体报错信息如下: 分析思路 1. 因为我采用的是选择性复制,只针对以下几个库进行复制: card,upay,deal,monitor,collect.所以,不太可能出现对于sa ...

随机推荐

  1. nodejs weixin 笔记

    http://www.oschina.net/code/snippet_218887_25870 好文章: http://codelife.me/blog/2013/04/23/developing- ...

  2. 安装ECshop普遍问题的解决方法

    安装ecshop经常会出现以下问题: 1.Strict Standards: Non-static method cls_image::gd_version() should not be calle ...

  3. pip是用国内镜像源

    pipy国内镜像目前有: http://pypi.douban.com/  豆瓣 http://pypi.hustunique.com/  华中理工大学 http://pypi.sdutlinux.o ...

  4. mysql Field xxx doesn't have a default value STRICT_TRANS_TABLES(存储引擎启用严格模式,非法数据值被拒绝)

    今天在插入一条数据时发生错误: Field serverid doesn’t have a default value. serverid是设置成了not null int类型的,但是插入的是'',就 ...

  5. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 用Appium去操作移动设备上的chrome

    最近在积极努力的学习Appium,今天成功运行了官网上的demo,在此做一个小小的总结: 前期准备工作: (1)在要运行的真机或模拟器上安装chrome. 注意:x86的虚拟机是不支持的,但是经过本人 ...

  7. Java编程思想(一):大杂烩

    在java中一切都被视为对象.尽管一切都是对象,但是操纵的标识符实际上是对象的一个引用,可以将引用想象成是遥控器(引用)来操纵电视机(对象).没有电视机,遥控器也可以单独存在,即引用可以独立存在,并不 ...

  8. JDBCTest

    package com.atguigu.spring.jdbc; import java.sql.SQLException; import java.util.ArrayList; import ja ...

  9. sklearn

    Feature extraction - sklearn文本特征提取 http://blog.csdn.net/pipisorry/article/details/41957763 http://sc ...

  10. php 环境的搭建

    ---恢复内容开始--- 在win7下配置 PHP + Apache + Mysql 环境 1. 准备环境 php: php-5.3.2-Win32-VC6-x86.VC9是专门为IIS定制的,VC6 ...