2021-05-06

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.出现报错:

2021-05-06

即:说明插入的从表中数据的 外键编号  不存在于 主表中主键的值

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)、序列,而后再重新执行所有代码,包括建表步骤,问题就简单解决啦。

(如果没有解决您的问题,还请见谅。如有错误,欢迎大家指正。谢谢你的支持哦~)

 

 

 

 

上一篇:Linux 脚本:冒泡排序


下一篇:leetcode 888. 公平的糖果交换(Fair Candy Swap)