该文章与上一篇文章外键未加索引和加索引的区别(一)区别就是子表的创建不一样:
--在外键上没有建索引的子表
CREATE TABLE emp
(emp_id number(10),
name varchar2(20) ,
dept_id number(2) CONSTRAINT fk_emp
references dept(dept_id)
);
ON DELETE CASCADE被删除,其他条件一样.
实验情况和原来的一样,下面列出了不同的实验:
外键未加索引情况,实验如下:
实验7、
Session7: 对父表DEPT进行删除操作,并且所更新的行在父表中实际不存:
delete from dept where 1=0;
Session0:此时加锁的信息都是如下:
SQL> @c:/showlock;
O_NAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN
---------- ---------- -------------------- --------------- ---------- ---------- ----------
DAIMIN 139 Row Exclusive DEPT 12 8 673
SQL> @c:/showalllock;
SID TYPE ID1 ID2 LOCK_TYPE REQUEST CTIME BLOCK
---------- ---- ---------- ---------- -------------------- ---------- ---------- ----------
139 TX 786440 673 Exclusive 0 3 0
139 TM 55606 0 Row Exclusive 0 3 0
分析:子表创建没有了ON DELETE CASCADE语句,此时对父表的删除如果父表的主键在子表中没有被使用,那么此删除不会对子表加任何锁,与子表无关。
Session7: 对父表DEPT进行删除操作,并且所更新的行在父表中实际不存在或者实际存在:
delete from dept where dept_id=12;
报错: ORA-02292:违反完整约束条件(DAIMIN.FK_EMP),-已找到子记录
分析:子表创建没有了ON DELETE CASCADE语句,此时对父表的删除如果父表的主键在子表中被使用,那么oracle就不允许你对父表的该条记录进行删除。
外键加索引情况,实验如下:
给表EMP的外键添加索引如下:
-- Create/Recreate indexes on the Foreign Key
create index EMP_DEPT_ID on EMP (DEPT_ID);
实验8、
Session7: 对父表DEPT进行删除操作,并且所更新的行在父表中实际存在:
delete from dept where dept_id=12;
报错: ORA-02292:违反完整约束条件(DAIMIN.FK_EMP),-已找到子记录
分析:子表创建没有了ON DELETE CASCADE语句,此时对父表的删除如果父表的主键在子表中被使用,那么oracle就不允许你对父表的该条记录进行删除。