您好,欢迎访问一九零五行业门户网

外键DDL在Oracle运行正常,在mysql报异常以及解决方案

记一个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的ddldrop 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 modelselect * from orders;1 order

mysql的ddldrop 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 modelselect * from orders;1 order

总结mysql的外键约束设计有缺陷,如果不同单位的字段一定不同,应在添加foreign key就报异常,而不是模棱两可的因为类型不同,但实际数值相等,其判断为不等于。
数据库表维护的时候,不同table中,意义相同的column,类型一定要保持一致。
相关文章:
mysql外键约束方式_mysql
mysql的外键约束级联删除
相关视频:
猎豹网mysql视频教程
以上就是外键ddl在oracle运行正常,在mysql报异常以及解决方案的详细内容。
其它类似信息

推荐信息