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

本文对mysql也成立。把创建表的数据类型从oracle支持的换成mysql支持的就行了,即:

number换成int, varchar2换成varchar。

创建外键后,表的结构为:

CREATE TABLE `emp_test` (
  `empno` int NOT NULL,
  `fname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `lname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `dept` int DEFAULT NULL,
  PRIMARY KEY (`empno`),
  KEY `fk_emp_dept_test` (`dept`),
  CONSTRAINT `fk_emp_dept_test` FOREIGN KEY (`dept`) REFERENCES `dept_test` (`deptno`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

删除外键后,表的结构为:

CREATE TABLE `emp_test` (
  `empno` int NOT NULL,
  `fname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `lname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `dept` int DEFAULT NULL,
  PRIMARY KEY (`empno`),
  KEY `fk_emp_dept_test` (`dept`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

以下为转载的原文内容。

原始链接:主外键关联删除(on delete set null和on delete cascade)主外键关联删除(on delete set null和on delete cascade)_bisal的专栏-CSDN博客主外键关联,当删除的是父表数据,参照这些要删除的数据,Oracle有三种处理方式:1、禁止删除,也是Oracle默认方法。2、将参照要删除数据的子表对应数据置空。3、将参照要删除数据的子表对应数据删除。对于1,比较容易理解,不解释。对于2,需要使用on delete set null建立外键约束。实验:create table dept_test(dhttps://blog.csdn.net/bisal/article/details/20898055

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



主外键关联,当删除的是父表数据,参照这些要删除的数据,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
这种删除表的和上面相同。
————————————————
版权声明:本文为CSDN博主「bisal」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bisal/article/details/20898055

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值