ORACLE数据库主键与外键的三种关系

1. No action on deletion or update(在删除或更新时候,没有任何动作.

2.Cascading deletions(级联删除)

3. Deletions that set null(删除设置为空值)

[@more@]

1. No action on deletion or update(在删除或更新时候,没有任何动作.

create table t3 (id int primary key,mname varchar2(20));

create table t4 (

xid number,

id int,

text varchar2(20),

constraint pk_xid primary key (xid),

constraint fk_id_t4 foreign key (id) references test.t3(id)

);

select owner,

constraint_name,

constraint_type,

r_owner,

r_constraint_name,

delete_rule

from dba_constraints

where constraint_name = 'FK_ID_T4';

OWNER CONSTRAINT_NAME CONSTRAINT_TYPE R_OWNER R_CONSTRAINT_NAME DELETE_RULE

-------------------------------------------------------------------------------------------------------------------------------------------

TEST FK_ID_T4 R TEST PK_ID_T3 NO ACTION

SQL>select * from t3;

ID MNAME

--- ----

1 aaa

2 ccc

3 ccc

4 eee

SQL> select * from t4;

XID ID TEXT

---- --------------------

10 1 xxxx

20 2 yyyy

30 3 xxxx

40 4 yyyy

SQL> update t3 set id=5 where id=4;

update t3 set id=5 where id=4

ORA-02292: 违反完整约束条件 (TEST.FK_ID_T4) - 已找到子记录

因为delete_rule NO ACTION,所以报错.

2.Cascading deletions(级联删除)

create table t3 (id int,mname varchar2(20),constraint pk_id_t3 primary key (id));

create table t4 (

xid number,

id int,

text varchar2(20),

constraint pk_xid primary key (xid),

constraint fk_id_t4 foreign key (id) references test.t3(id) on delete cascade

);

select owner,

constraint_name,

constraint_type,

r_owner,

r_constraint_name,

delete_rule

from dba_constraints

where constraint_name = 'FK_ID_T4';

OWNER CONSTRAINT_NAME CONSTRAINT_TYPE R_OWNER R_CONSTRAINT_NAME DELETE_RULE

-------------------------------------------------------------------------------------------------------------------------------------------

TEST FK_ID_T4 R TEST PK_ID_T3 CASCADE

SQL>select * from t3;

ID MNAME

--- ----

1 aaa

2 ccc

3 ccc

4 eee

SQL> select * from t4;

XID ID TEXT

---- --------------------

10 1 xxxx

20 2 yyyy

30 3 xxxx

40 4 yyyy

SQL> delete from t3 where id=4;

1 row deleted

SQL> commit;

Commit complete

再次查看:

SQL>select * from t3;

ID MNAME

--- ----

1 aaa

2 ccc

3 ccc

--父表记录已经被删除

SQL> select * from t4;

XID ID TEXT

---- --------------------

10 1 xxxx

20 2 yyyy

30 3 xxxx

--子表记录已经被级联删除

因为delete_rule的值为CASCADE.

注意,级联更新还是不行,人家oracle说过嘛,是“级联删除”,而非“级联更新”

SQL> update t3 set id=4 where id=3;

update t3 set id=4 where id=3

ORA-02292: 违反完整约束条件 (TEST.FK_ID_T4) - 已找到子记录

3. Deletions that set null(删除设置为空值)

create table t3 (id int,mname varchar2(20),constraint pk_id_t3 primary key (id));

create table t4 (

xid number,

id int,

text varchar2(20),

constraint pk_xid primary key (xid),

constraint fk_id_t4 foreign key (id) references test.t3(id) on delete set null

);

select owner,

constraint_name,

constraint_type,

r_owner,

r_constraint_name,

delete_rule

from dba_constraints

where constraint_name = 'FK_ID_T4';

OWNER CONSTRAINT_NAME CONSTRAINT_TYPE R_OWNER R_CONSTRAINT_NAME DELETE_RULE

-------------------------------------------------------------------------------------------------------------------------------------------

TEST FK_ID_T4 R TEST PK_ID_T3 SET NULL

SQL> delete from t3 where id=4;

1 row deleted

SQL> commit;

Commit complete

SQL>select * from t3;

ID MNAME

--- ----

1 aaa

2 ccc

3 ccc

--父表记录已经被删除

SQL> select * from t4;

XID ID TEXT

---- --------------------

10 1 xxxx

20 2 yyyy

30 3 xxxx

40 yyyy --子表记录已经被级联为空值.

请使用浏览器的分享功能分享到微信等