主外键关联删除(on delete set null和on delete cascade)

简介: 主外键关联,当删除的是父表数据,参照这些要删除的数据,Oracle有三种处理方式:1、禁止删除,也是Oracle默认方法。2、将参照要删除数据的子表对应数据置空。

主外键关联,当删除的是父表数据,参照这些要删除的数据,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建立外键约束。实验

alter table emp_test
add constraint fk_emp_dept_test foreign key(dept) references dept_test(deptno) on delete cascade;

delete from dept_test where deptno = 1;
1 row deleted.

SQL> select * from dept_test;
    DEPTNO DEPTNAME
---------- ------------------------------
     2 财务部

SQL> select * from emp_test;
     EMPNO FNAME          LNAME                  DEPT
---------- -------------------- -------------------- ----------
     3 Linda          Liu                     2
可以看到子表中参照父表的行也被删除了。

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
这种删除表的和上面相同。

目录
相关文章
|
3月前
|
JavaScript 前端开发
15 Uncaught TypeError: Cannot set properties of null (setting ‘onclick‘)
这篇文章解释了在HTML文档中因JavaScript代码在页面元素加载之前执行导致的"Cannot set properties of null (setting ‘onclick’)"错误,并提供了将JavaScript代码置于`<body>`标签内或使用`window.onload`事件确保DOM完全加载后再绑定事件处理器的解决办法。
15 Uncaught TypeError: Cannot set properties of null (setting ‘onclick‘)
|
5月前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
329 0
|
JavaScript API
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
286 0
|
SQL 数据库 数据库管理
sql数据定义语句(cascade,set,null,no action的区别)
sql数据定义语句(cascade,set,null,no action的区别)
271 0
|
关系型数据库 MySQL
Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
221 0
Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
|
JavaScript
js代码Uncaught TypeError: Cannot set properties of null (setting ‘innerHTML‘)问题解决
js代码Uncaught TypeError: Cannot set properties of null (setting ‘innerHTML‘)问题解决
1513 0
js代码Uncaught TypeError: Cannot set properties of null (setting ‘innerHTML‘)问题解决
|
关系型数据库 MySQL
Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL、Set DEFAULT
Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL、Set DEFAULT
264 0
|
SQL 关系型数据库 MySQL
MySQL运行SQL:[ERR] 1231 - Variable ‘time_zone‘ can‘t be set to the value of ‘NULL‘
MySQL运行SQL:[ERR] 1231 - Variable ‘time_zone‘ can‘t be set to the value of ‘NULL‘
2338 0
|
关系型数据库 MySQL 索引
MySQL的外键约束:Cascade/Restrict/No action/SET NULL :级联操作
转自:http://blog.csdn.net/cnjsnt_s/article/details/5548280 具体使用时需要参考:http://blog.csdn.net/codeforme/article/details/5539454 (注:没看很明白,囧。
1148 0