问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MYSQL运行正常,换了个数据库(oracle)就报 ORA-02291: violated - parent key not found

发布网友 发布时间:2022-04-13 00:27

我来回答

3个回答

懂视网 时间:2022-04-13 04:49

记一个Mysql外键约束设计缺陷

背景信息

最近在做项目的数据库迁移,从Oracle到Mysql,一个外键约束在Oracle运行正常,在mysql报异常。(因为才接手没几天,对业务和框架不熟,在处理问题时花了很多时间。)

[2018-08-01 13:34:19] [23000][1452] Cannot add or update a child row: a foreign key constraint fails (`bov`.`PRO_SITES_BRANDREQUEST`, CONSTRAINT `AA` FOREIGN KEY (`ID`) REFERENCES `PRO_SITES_SETUPREQUEST` (`ID`) ON DELETE CASCADE)

Oracle的DDL

drop table Models;
CREATE TABLE Models
(
 ModelID number(6) PRIMARY KEY,
 Name VARCHAR(40)
);

drop table Orders;
CREATE TABLE Orders
(
 ModelID number(8) PRIMARY KEY,
 Description VARCHAR(40),
 FOREIGN KEY (ModelID) REFERENCES Models (ModelID)
 ON DELETE cascade
);

insert into Models(ModelID, Name) values (1,'model');
insert into Orders(ModelID,Description) values (1,'order');
select * from Models;
1 model

select * from Orders;
1 order

Mysql的DDL

drop table Models;
CREATE TABLE Models
(
 ModelID decimal(6,0) PRIMARY KEY,
 Name VARCHAR(40)
);

drop table Orders;
CREATE TABLE Orders
(
 ModelID decimal(8,0) PRIMARY KEY,
 Description VARCHAR(40),
 FOREIGN KEY (ModelID) REFERENCES Models (ModelID)
 ON DELETE cascade
);


insert into Models(ModelID, Name) values (1,'model');
insert into Orders(ModelID,Description) values (1,'order');

在执行最后一句时,报异常

[2018-08-01 14:06:16] [23000][1452] Cannot add or update a child row: a foreign key constraint fails (`bov`.`Orders`, CONSTRAINT `Orders_ibfk_1` FOREIGN KEY (`ModelID`) REFERENCES `Models` (`ModelID`) ON DELETE CASCADE)

原因:Models的ModelID是decimal(6,0),而Orders的ModelID是decimal(8,0),两个通过外键相连。因为类型不一致,mysql就不会认为其一定不等,而oracle可以做到不同类型的相容判等。

解决方案
drop table Orders;
CREATE TABLE Orders
(
 ModelID decimal(6,0) PRIMARY KEY,
 Description VARCHAR(40),
 FOREIGN KEY (ModelID) REFERENCES Models (ModelID)
 ON DELETE cascade
);

insert into Orders(ModelID,Description) values (1,'order');
select * from Models;
1 model

select * from Orders;
1 order

总结

  1. Mysql的外键约束设计有缺陷,如果不同单位的字段一定不同,应在添加FOREIGN KEY就报异常,而不是模棱两可的因为类型不同,但实际数值相等,其判断为不等于。

  2. 数据库表维护的时候,不同table中,意义相同的column,类型一定要保持一致。

相关文章:

MySQL外键约束方式_MySQL

MySQL的外键约束级联删除

相关视频:

猎豹网MySQL视频教程

热心网友 时间:2022-04-13 01:57

假设两个表A和B,B中定义了一个外键,它的d列reference到A表的c列。在往d列插数据的时候,其值在c列里面并不存在,于是触发这个错误。

从程序角度来说,可能的原因是:程序使用了事务,但是往A表插数据的事务和往B表插数据的事务不是同一个,且都没有commit。虽然写的人觉得,已经往A表插了相应的数据了,但是在往B表插数据的时候,依然无法reference到对应的数据。这个一般不是故意为之,往往是一些疏忽造成的。追问事务交给spring了,应该怎么样解决了

热心网友 时间:2022-04-13 03:15

两个表之间有外键约束关系,但是外表中的某主键值在主表被引用列中不存在,所以造成这种情况.
按你的实际情况,去掉外键约束,或者补充需要的数据.追问外键不能去掉,我是用JPA,事务交给spring了,有什么方法可以解决了?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
cad里面打完字怎么还原十字架 财务建帐需要什么 建账建账的基本要求 当爱情与亲情需要丢弃一样时,你会选择丢弃哪一方 当爱情和亲情有冲突时你会怎样决择?你会为你所爱的人不顾一切吗? 剑网三 查看余额 因为某些特殊原因不好登陆游戏查看,求其他方式_百度知 ... 右肺上叶中叶结节灶怎么回事 节能门窗有哪些标准 节能门窗有哪些 节能门窗具有哪些特征 tf家族黄其林因为榴莲蛋糕哭是什么事? 千层蛋糕的做法,9寸榴莲千层蛋糕怎么做好 榴莲奶油怎么做 怎么做好吃,榴莲慕斯蛋糕的家常做法 什么样的硒片比较好,有没有推荐? 打算买硒片,看某宝上比较好的就是有机硒和麦芽硒,请问这两种那种好? 四物汤加生鸡,鸡子有什么功效 酒店企业管理的基本方法??? 酒店管理的基本法是什么 一个QQ能建立多少个群?? 肉的做法,蒜苔炒肉怎么做好吃,蒜苔炒肉的家常做法 一个QQ能建多少个群? 哺乳期能吃大蒜炒肉吗 耳朵疼带口罩? 哺乳期能吃蒜苔炒肉吗 我有辆丰田车,做汽车抵押贷款,请问哪个公司的贷款利息比较低? 在Eclipse中连接Orcale Driver可以,但是到Mysql则出现如下异常。请问该如何解决? 手机屏幕不会休眠是怎么回事? 我是中国国籍我老婆日本国籍她可以申请中国国籍吗?求大神帮助 日本人加入中国国籍有什么要求 45岁的男人应该有什么? 45岁的男人? 说男人45了 有什么含义吗 对于45岁的男人如何自我保健? 45岁以上的男人如何保健? 男人45岁还能干什么? 为什么说四十五岁的男人最花心? 45岁的男人算老男人吗 45岁的男人老吗 45岁男人一个星期多少次性生活正常 分期付款买车怎么算 买车的话,分期付款怎么算啊?请懂的帮忙指点,谢谢了!! 将以下在Oracle中正常运行的sql语句转换为能在MySQL中正常运行的sql语句。 微信怎么修改实名制微信实名制想换一个银行卡,以前的银行卡里面钱要不要紧。 PROE5.0 3D转2D过后怎么画剖视图 请问在PROE工程图中怎么画这种剖视图? proe中如何做阶梯剖 猪腰子炒什么好吃 中式婚礼中各种道具都有什么含义 丈母娘挑担子为啥要伞和扇子?