主外鍵關聯,當删除的是父表資料,參照這些要删除的資料,Oracle有三種處理方式:
1、禁止删除,也是Oracle預設方法。
2、将參照要删除資料的子表對應資料置空。
3、将參照要删除資料的子表對應資料删除。
對于1,比較容易了解,不解釋。
對于2,需要使用on delete set null建立外鍵限制。實驗:
create table dept_test
(deptno number(10) not null,
deptname varchar2(30) not null,
constraint pk_dept_test primary key(deptno));
create table emp_test
(empno number(10) not null,
fname varchar2(20) ,
lname varchar2(20) ,
dept number(10) ,
constraint pk_emp_test primary key(empno));
alter table emp_test
add constraint fk_emp_dept_test foreign key(dept) references dept_test(deptno) on delete set null;
insert into dept_test values(1,'銷售部');
insert into dept_test values(2,'财務部');
insert into emp_test values (2,'Mary','Song',1);
insert into emp_test values (3,'Linda','Liu',2);
insert into emp_test values (4,'Linlin','Zhang',1);
delete from dept_test where deptno = 1;
1 row deleted.
SQL> select * from emp_test;
EMPNO FNAME LNAME DEPT
---------- -------------------- -------------------- ----------
2 Mary Song
3 Linda Liu 2
4 Linlin Zhang
SQL> select * from dept_test;
DEPTNO DEPTNAME
---------- ------------------------------
2 财務部
可以看到emp_test中參照dept_test中deptno=1的兩條記錄對應dept值已經置為空。
SQL> truncate table emp_test;
Table truncated.
SQL> truncate table dept_test;
truncate table dept_test
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
此時也是禁止清空dept_test表,drop相同。
如果想要删除父表,可以有兩種方法:
1、先drop子表,再drop父表。
2、先删除限制alter table emp_test drop constraint fk_emp_dept_test;,再drop父表。
對于3,需要使用on delete cascade建立外鍵限制。實驗:
add constraint fk_emp_dept_test foreign key(dept) references dept_test(deptno) on delete cascade;
可以看到子表中參照父表的行也被删除了。
這種删除表的和上面相同。