oracle设置表的主键和外键,Oracle 父表修改与外键的关系(主键DML与外键的关系)...

Data Integrity

学习(二)

父表修改与外键的关系(主键

DML

与外键的关系)

【这张表就是本文重点】

viewspace-753900

viewspace-753900

DML Statement

Issued Against Parent Table

Issued Against Child Table

viewspace-753900

viewspace-753900

INSERT

Always OK if the parent key value is unique

OK only if the foreign key value exists in the parent key or is partially or all null

UPDATE NO

ACTION

Allowed if the statement does not leave any rows in the child table without a referenced parent key value

Allowed if the new foreign key value still references a referenced key value

DELETE NO

ACTION

Allowed if no rows in the child table reference the parent key value

Always OK

DELETE CASCADE

Always OK

Always OK

DELETE SET

NULL

Always OK

Always OK

主键

DML

与外键的关系

1

INSERT:

主键可以匹配数值,允许外键列插入

2

UPDATE NO

ACTION

:主键更新没有匹配的数据是允许的,更新被匹配的数据不允许

3

DELETE NO

ACTION

:主键删除没有被匹配的数据时允许的,删除被匹配的数据不允许

4

DELETE CASCADE

:使用了

DELETE CASCADE

,删除主键列数据,会级联删除外键列相应的数据

5

DELETE SET

NULL

:使用了

DELETE SET

NULL

,删除主键列数据,会把外键列相应的数据

DELETE SET

NULL

实验:

Parent table : t3

primary key : t3.id

Child table: t3_fk

foreign key : t3_fk.id

1

DML Statement

INSERT

doudou@TEST> insert into t3 values (2,'3');

1 row created.

doudou@TEST> commit;

Commit complete

doudou@TEST> insert into t3_fk values (2,'fk_2');

1 row created.

doudou@TEST> commit;

Commit complete

【外键列插入的数据在父表主键列能相应的匹配到,允许外键列数据插入】

viewspace-753900

viewspace-753900

2

DML Statement

UPDATE NO

ACTION

doudou@TEST> select * from t3;

ID NAME

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

1 1

2 3

3 pk_3

doudou@TEST> select * from t3_fk;

ID NAME

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

1 pk_1

pk_2

2 fk_2

doudou@TEST> update t3 set id=4 where id=3;

1 row updated.

doudou@TEST> update t3 set id=5 where id=2;

update t3 set id=5 where id=2

*

ERROR at line 1:

ORA-02292: integrity constraint (DOUDOU.SYS_C007471) violated - child record found

doudou@TEST> select * from t3;

ID NAME

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

1 1

2 3

4 pk_3

doudou@TEST> update

t3_fk set id=3 where id=2;

update

t3_fk set id=3 where id=2

*

ERROR at line 1:

ORA-02291: integrity constraint (DOUDOU.SYS_C007471) violated - parent key not found

doudou@TEST> update t3_fk set id=4 where id=2;

1 row updated.

【父表

update

update

主键列没有被外键相关联的数据,是可以更新的。

子表

update

update

外键列的数据,更改后的数据在主键列可以找到相应的匹配是允许修改的。找不到不允许修改】

viewspace-753900

viewspace-753900

3

DML Statement

DELETE NO

ACTION

doudou@TEST> select * from t3;

ID NAME

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

1 1

2 3

4 pk_3

3 pk_3

doudou@TEST> select

* from t3_fk;

ID NAME

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

1 pk_1

pk_2

4 fk_2

doudou@TEST> delete t3 where id=3;

1 row deleted.

doudou@TEST> delete t3 where id=4;

delete t3 where id=4

*

ERROR at line 1:

ORA-02292: integrity

viewspace-753900

viewspace-753900

constraint

(DOUDOU.SYS_C007471) violated - child record found

doudou@TEST> delete t3_fk where id=4;

1 row deleted.

【父表

delete

delete

主键列没有被外键列相匹配的数据,是允许的。已经被匹配的不允许删除,可以先删除子表匹配的数据,然后删除主键列被匹配的数据。

子表

delete

delete

外键列的数据是被允许的。】

viewspace-753900

4

DML Statement

DELETE CASCADE

doudou@TEST>

viewspace-753900

viewspace-753900

select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME from user_constraints where table_name ='T3_FK';

CONSTRAINT_NAME

CO TABLE_NAME

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

SYS_C007471

R

T3_FK

doudou@TEST> alter table t3_fk drop constraints SYS_C007471;

Table altered.

doudou@TEST> alter table t3_fk add constraints t3_fk_id

foreign key (id)

references t3 (id)

on delete cascade;

--delete cascade

语法

Table altered.

doudou@TEST> select * from t3;

ID NAME

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

1 1

2 3

4 pk_3

doudou@TEST> select * from t3_fk;

ID NAME

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

1 pk_1

pk_2

doudou@TEST> delete t3 where id=1;

1 row deleted.

doudou@TEST> commit;

Commit complete.

doudou@TEST> select * from t3;

ID NAME

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

2 3

4 pk_3

doudou@TEST> select * from t3_fk;

ID NAME

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

pk_2

doudou@TEST> delete t3_fk;

1 row deleted.

【外键约束使用

delete cascade

:删除主键列的数据会级联把外键相关联的数据

delete

5

DML Statement

DELETE SET

NULL

doudou@TEST>

select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME from user_constraints where table_name ='T3_FK';

CONSTRAINT_NAME

CO TABLE_NAME

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

T3_FK_ID

R

T3_FK

doudou@TEST> alter

table t3_fk drop constraints t3_fk_id;

Table altered.

doudou@TEST> alter table t3_fk add constraint t3_fk_id

foreign key (id)

references t3 (id)

on delete set null;

--delete set null

语法

Table altered.

doudou@TEST> select * from t3;

ID NAME

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

2 3

4 pk_3

doudou@TEST> select * from t3_fk;

ID NAME

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

2 fk_2

doudou@TEST> delete t3 where id=2;

1 row deleted.

doudou@TEST> commit;

Commit complete.

doudou@TEST> select * from t3;

ID NAME

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

4 pk_3

doudou@TEST> select * from t3_fk;

ID NAME

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

fk_2

【外键约束使用

delete set null :

删除主键的数据会使外键列相应的数据

delete set null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值