日期:2014-05-17  浏览次数:20895 次

oracle里的参照完整性有问题吗?
现有
  员工关系(员工编号,姓名,性别,部门编号)==》 主码是员工编号,部门编号为员工关系的外码
  部门关系(部门编号,部门名称)==》 部门编号是主码
   
现有以下SQL语句:
 insert into 员工 values('e005','kk','f',NULL)这条语句为什么会报错,难道参照完整性有问题?
 根据数据库原理:1.若一个关系R1中外码的取值要参照另一个关系R2中主码的取值,则称R1为参照关系,R2为被参照关系  
参照完整性规则:参照关系中每个元素的外码要么为空值,要么等于被参照关系中某个元组的主码。

------解决方案--------------------
SQL code

-- Create table
create table DEPT_TEST
(
  DEPTNO NUMBER(2) not null,
  DNAME  VARCHAR2(14),
  LOC    VARCHAR2(13)
);
alter table DEPT_TEST
  add constraint PK_DEPT_TEST primary key (DEPTNO);
  
-- Create table
create table EMP_TEST
(
  EMPNO    VARCHAR2(10),
  ENAME    VARCHAR2(10),
  SEX      VARCHAR2(9),
  DEPTNO   NUMBER(2)
);
alter table EMP_TEST
  add constraint FK_DEPTNO_TEST foreign key (DEPTNO)
  references DEPT_TEST (DEPTNO);

SQL>  select * from dept_test;
 
DEPTNO DNAME          LOC
------ -------------- -------------
SQL>   --插入deptno空的时候可以正常插入
SQL>   insert into EMP_TEST values('e005','kk','f',NULL);
 
1 row inserted
SQL>   COMMIT;
 
Commit complete
SQL>   SELECT * FROM EMP_TEST;
 
EMPNO      ENAME      SEX       DEPTNO
---------- ---------- --------- ------
e005       kk         f         
SQL>   insert into EMP_TEST values('e005','kk','f',10);
 
insert into EMP_TEST values('e005','kk','f',10)
 
ORA-02291: integrity constraint (SCOTT_TEST.FK_DEPTNO_TEST) violated - parent key not found
SQL>   COMMIT;
 
Commit complete
SQL>   SELECT * FROM EMP_TEST;
 
EMPNO      ENAME      SEX       DEPTNO
---------- ---------- --------- ------
e005       kk         f