PL/SQL Developer 中建表,然后插入数据时报错:“ORA-02291:违反完整约束条件(*) -未找到父项关键字”原因及解决方案:
(这里介绍我怎么出错以及怎么解决的,按步骤保证解决你的问题)
分析原因:说明插入的从表中数据的 外键编号 不存在于 主表中主键的值
1.建立第一张职员表(tbEmp)表:
--创建员工信息表
create table tbEmp(
eid int primary key,
ename varchar2(8) not null unique--姓名
constraint CK_ename check(length(ename) > 1 and length(ename) < 6),--对姓名长度进行约束
esex varchar2(2) default '男' not null --性别默认为男,不能为空
constraint CK_esex check(esex in('男', '女')),--对性别值进行约束
eAge int not null ---年龄
constraint CK_eAge check(eAge between 18 and 50),
eaddr varchar2(200) default '地址不详'
);
create sequence seq_tbEmp start with 10000 increment by 1;--设置序列编号【这里重点注意,就是出错原因所在】
2.建立第二张销售(tbsales)报表:
--创建销售报表
create table tbSales(
srno int primary key,
eid int not null,
pid int not null,
pqty int not null
constraint CK_pqty check(pqty >= 0),
pamount Numeric(10,2) not null
constraint CK_pamount check(pamount >= 0),
sdate date not null,
constraint FK_eid foreign key(eid) references tbEmp(eid),
constraint FK_pid foreign key(pid) references tbProd(pid)
);
create sequence seq_tbSales start with 1 increment by 1;
3.给第二张表插入四条数据:
insert into tbSales values(seq_tbSales.Nextval,10000,5,1,4000,to_date('2012-5-14','yyyy-mm-dd'));
insert into tbSales values(seq_tbSales.Nextval,10001,1,2,8000,to_date('2012-3-14','yyyy-mm-dd'));
insert into tbSales values(seq_tbSales.Nextval,10001,3,1,4200,to_date('2012-3-26','yyyy-mm-dd'));
insert into tbSales values(seq_tbSales.Nextval,10001,2,1,4200,to_date('2012-3-26','yyyy-mm-dd'));
4.出现报错:
即:说明插入的从表中数据的 外键编号 不存在于 主表中主键的值
5.错误发现及解决:
--仔细检查发现,外键FK_EID对应的表tbEmp的主键序列编号是从 1000 开始的,如下:
create sequence seq_tbEmp start with 1000 increment by 1;
--而插入数据序列外键编号是从 10000 开始的,如下(所以主键序列编号应该和外键序列编号设置一致):
insert into tbSales values(seq_tbSales.Nextval,10000,5,1,4000,to_date('2012-5-14','yyyy-mm-dd'));
insert into tbSales values(seq_tbSales.Nextval,10001,1,2,8000,to_date('2012-3-14','yyyy-mm-dd'));
insert into tbSales values(seq_tbSales.Nextval,10001,3,1,4200,to_date('2012-3-26','yyyy-mm-dd'));
insert into tbSales values(seq_tbSales.Nextval,10001,2,1,4200,to_date('2012-3-26','yyyy-mm-dd'));
--由于我需要插入的数据已经写好且编号都从10000开始,所以方便起见:我改主键序列编号,对插入数据不做修改,大家可以根据情况自己定。【所以改为】:
--错的 create sequence seq_tbEmp start with 1000 increment by 1;
--改正后的:create sequence seq_tbEmp start with 10000 increment by 1;
6.必须注意的一点:
改正代码后需要删除 销售报表(tbsales)、序列,而后再重新执行所有代码,包括建表步骤,问题就简单解决啦。
(如果没有解决您的问题,还请见谅。如有错误,欢迎大家指正。谢谢你的支持哦~)