该文章与上一篇文章外键未加索引和加索引的区别
(
一
)
区别就是子表的创建不一样
:
--
在外键上没有建索引的子表
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
就不允许你对父表的该条记录进行删除。