java怎么删除未命名的外键_删除带外键的表【foreign key constraint fails】报错
发布日期:2021-06-24 15:11:08 浏览次数:2 分类:技术文章

本文共 2333 字,大约阅读时间需要 7 分钟。

title: 删除带外键的表【foreign key constraint fails】报错

date: 2018-08-02 21:59:06

tags: 数据库

遥想当时正在学hibernate的时候,刚好学到了一对多,多对多的关联操作。时间也正是刚好在那是有了一个项目,把各表的间的结构还理清,俗话说学到就要用到,就把这些表的结构都能配置级联关系的都把它配上。没想到就在这里给自己放了个小坑。前几天在一个帖子中看到别人说,尽量少配些ORM约束,数据库的外键约束什么的。当时还不以为然。没想到我就遇到了这个问题,或许对数据库操还是不是很熟悉的人约束真的不要配太多。不过有自然有其的好处就是。

今天在删除一张表的数据的时候报了如下错误:

09:55:49.144 [http-nio-8080-exec-6] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Cannot delete or update a parent row: a foreign key constraint fails (`checkin`.`right_umenu`, CONSTRAINT `FKnmg8itd642tdyn6qh1q42h60r` FOREIGN KEY (`menu_detailPid`) REFERENCES `menu_detail` (`id`))

09:55:49.151 [http-nio-8080-exec-6] ERROR org.hibernate.internal.SessionImpl - HHH000346: Error during managed flush [could not execute statement]

org.hibernate.exception.ConstraintViolationException: could not execute statement

at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)

at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)

at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3198)

.......

​在网上查找后得到的结果和我认为的是一样的,就是外键的问题引发的(当然报错里信息都写了foreign key什么的还不知道,那怎么行(●ˇ∀ˇ●))。网上是说:表之间强制生成了外键,在删除操作时,数据库会检查表间的关系导致无法删除。

解决办法:

SET foreign_key_checks = 0; // 先设置外键约束检查关闭

drop table table1; // 删除表,如果要删除视图,也是如此

SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性

原理:

MySQL的环境变量中存在一个foreign_key_checks,这是默认检查外键的配置项,如果将其设置为0,则表示不检查外键约束。查看foreign_key_checks的值:

show VARIABLES like "foreign%";

然而,然而。我即使把外键约束检查关闭,但是在打开检查的地方又还会报错。这我就无奈了。

不过我在尝试时把,外键的删除项由 RESTRICT 改为 CASCADE 时不但能删除且不影响我的另一个方法的执行,而且的更方便的执行了我想写的方法。

后面又继续查,这是数据库定义外键的一个选项,操作时可以知道update 和delete 后面可以跟的词语有四个 :

no action , set null , set default ,cascade 。

no action 表示 不做任何操作,

set null 表示在外键表中将相应字段设置为null

set default 表示设置为默认值(restrict)

cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除

所以当我如此设置的时候就把想做的级联删除也都执行了,数据库的很多东西都还要去补啊。

转载地址:https://blog.csdn.net/weixin_33572836/article/details/114536778 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java multithread_Java MultiThread学习笔记
下一篇:getmodifiers java_int getModifiers()

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月31日 01时54分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Android开发技术总结!BTAJ大厂最新面试题汇集,不吃透都对不起自己 2021-07-02
Android开发知识体系!3年Android开发工程师面试经验分享,先收藏了 2021-07-02
Android开发社招面试经验:渣本毕业两年经验,附架构师必备技术详解 2021-07-02
android开发需要学什么!大佬手把手教你如何仿写出大厂的APP,深度好文 2021-07-02
android性能优化工具!我在华为做Android外包的真实经历!先收藏了 2021-07-02
android性能调优!阿里面试100%会问到的JVM,已拿offer入职 2021-07-02
安卓app开发书籍!掌握这些Android开发热门前沿知识,面试心得体会 2021-07-02
安卓app开发教程pdf!Android组件化架构实践,值得收藏! 2019-04-29
安卓app开发架构!让你明明白白的使用RecyclerView,满满干货指导 2019-04-29
安卓app软件开发教程!为什么Flutter能最好地改变移动开发?系列篇 2019-04-29
安卓framework层开发!Android高级工程师必看系列,建议收藏 2019-04-29
安卓framework层开发!给后辈的一点建议,持续更新中 2019-04-29
安卓ios开发培训!华为Android面试真题解析,高级面试题+解析 2019-04-29
安卓sdk开发!阿里面试100%会问到的JVM,架构师必备技能 2019-04-29
安卓ui开发语言!Activity的6大难点,你会几个?一线互联网公司面经总结 2019-04-29
android学习路线!字节跳动Android三面凉凉,社招面试心得 2019-04-29
android定位!Android开发究竟该如何学习,全网疯传 2019-04-29
android定时任务!互联网寒冬公司倒闭后,吐血整理 2019-04-29
android定时启动app!细数Android开发者的艰辛历程,大厂面经合集 2019-04-29
android定时开关机!微信小程序的事件处理,学习路线+知识点梳理 2019-04-29