ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-05-06

2021-05-06 21:57:14  阅读:230  来源: 互联网

标签:06 seq 05 -- Nextval 2021 date tbSales 2012


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

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

 

 

 

 

标签:06,seq,05,--,Nextval,2021,date,tbSales,2012
来源: https://blog.csdn.net/CSDN_Mr_Z/article/details/116463246

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有