关于这个问题出现的原因如下图所示
一般来讲,主要的就是因为第三点,简单的说就是子表的字段中有一些值,在父表中找不到,所以就会导致这种错误
说一下我遇到的情况:
sql语句在idea Database工具 和Navicat 查询窗口都能正常执行,但是在代码中使用prepareStatement执行就会出错
一开始我是直接排除了两表值不匹配的原因,因为我在mysql工具中是完全可以执行的,然后我就完全把方向搞反了,换驱动,删表建表,乱七八糟的方法都试,没用!冷静下来一想,是不是编码问题,这是我最开始测试的sql
insert into tb_student(student_id, student_name,student_sex, grade, classe, major_id, major_name, department_id, department_name) values('20180011','张三','男',2018,1,13,'软件开发','01','计算机学院')
我把这里面的中文全部换成字母和数字,在对应的主表里添加上数据,果不其然,使用ps插入成功了,为了进一步验证我的想法,我在使用ps插入之前,使用SET FOREIGN_KEY_CHECKS=0;
把外键约束关闭了,将中文插入进去以后,表中显示的是
中文全部都成了 ?
,这波石锤,必是编码问题!
所以,大家在遇到和我相同的问题时,如果尝试了一些方法没有用,可以把外键约束关了,强制插入中文试试,看看是不是出现了乱码
在解决乱码问题时,出现了一个新的问题,我把idea 和 mysql全局设置为utf8编码后,这时插入中文不再显示问号(关闭外键约束),但依然乱码
由于我这个项目是从github拉下来的,一开始是gbk编码,我把编码改回gbk,它插入反而正常了,我不知道为什么,希望好心人能留言告诉我Thanks♪(・ω・)ノ