外键约束drop table cascade constraints

--整理以前的学习笔记


create table dept(deptno number(2) primary key,dname varchar2(20));
create table emp(empno number(4) primary key,ename varchar2(20),deptno number(2));
alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno);


SQL> select object_name,object_type from user_objects;
OBJECT_NAME                                                                      OBJECT_TYPE
-------------------------------------------------------------------------------- -------------------
DEPT                                                                             TABLE
SYS_C00161025                                                                    INDEX
EMP                                                                              TABLE
SYS_C00161026                                                                    INDEX
 
SQL> select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
------------------------------ --------------- ------------------------------
SYS_C00161026                  P               EMP
EMP_DEPTNO_FK                  R               EMP
SYS_C00161025                  P               DEPT


insert into dept values(10,'Test');
insert into dept values(20,'Develop');
insert into dept values(30,'HR');
insert into dept values(40,'Sales');
insert into dept values(50,'Finance');
commit;
select * from dept;


insert into emp values(0001,'Nancy',10);
insert into emp values(0002,'Tom',10);
insert into emp values(0003,'Anne',20);
insert into emp values(0004,'Alice',30);
insert into emp values(0005,'Gaby',40);
insert into emp values(0006,'Lynette',30);
commit;
select * from emp;


alter table emp modify constraint emp_deptno_fk on delete set null;--好像没有这样的语法,需要先删除约束再重

新创建
alter table emp drop constraint emp_deptno_fk;
alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno) on delete set

null;


delete from dept where deptno='10';
commit;


SQL> select * from emp;
 
EMPNO ENAME                DEPTNO
----- -------------------- ------
    1 Nancy               
    2 Tom                 
    3 Anne                     20
    4 Alice                    30
    5 Gaby                     40
    6 Lynette                  30
 
6 rows selected
 
SQL> select * from dept;
 
DEPTNO DNAME
------ --------------------
    20 Develop
    30 HR
    40 Sales
    50 Finance


alter table emp drop constraint emp_deptno_fk;
alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno) on delete cascade;


delete from dept where deptno='20';
commit;


SQL> select * from emp;
 
EMPNO ENAME                DEPTNO
----- -------------------- ------
    1 Nancy               
    2 Tom                 
    4 Alice                    30
    5 Gaby                     40
    6 Lynette                  30
 
SQL> select * from dept;
 
DEPTNO DNAME
------ --------------------
    30 HR
    40 Sales
    50 Finance

SQL> drop table dept;
 
drop table dept
 
ORA-02449: 表中的唯一/主键被外键引用
SQL> truncate table dept;
 
truncate table dept
 
ORA-02266: 表中的唯一/主键被启用的外键引用
 
SQL> delete from emp;
 
5 rows deleted
 
SQL> commit;
 
Commit complete
 
SQL> select * from emp;
 
EMPNO ENAME                DEPTNO
----- -------------------- ------
 
SQL> drop table dept;
 
drop table dept
 
ORA-02449: 表中的唯一/主键被外键引用
SQL> truncate table dept;
 
truncate table dept
 
ORA-02266: 表中的唯一/主键被启用的外键引用

 

--dept作为外键约束中的父表,即使子表是空的,也是不能删除或截断(truncate)父表的

 

SQL> drop table dept cascade constraints;
 
Table dropped

 

--cascade constraints会删除这个外键约束,但是drop table本身会删除表和表上的索引

 

SQL> select object_name,original_name,type from recyclebin;
 
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$bcICjAueQ/ekMLy2QJ6GGw==$0 SYS_C00161025                    INDEX
BIN$7FcUpfs4QvuWPLfdY20WXw==$0 DEPT                             TABLE
--这两条记录是drop table dept之后(删除了表和表上的主键索引),放在recyclebin里的


SQL> select constraint_name,constraint_type,table_name from user_constraints;
 
CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
------------------------------ --------------- ------------------------------
SYS_C00161026                  P               EMP
BIN$MAHIsiW1Q82obz6WEOtqyw==$0 P               BIN$7FcUpfs4QvuWPLfdY20WXw==$0


由于创建主键约束之后,会同时创建一个同名的索引,但是表删除之后recyclebin里面只有索引,没有约束,但是查询

user_constraints表里面的约束名和对应的表名已经发生变化了


SQL> select object_name,object_type from user_objects;
 
OBJECT_NAME                                                                      OBJECT_TYPE
-------------------------------------------------------------------------------- -------------------
EMP                                                                              TABLE
SYS_C00161026                                                                    INDEX
--可以看到dept对应的表和索引已经在user_objects里面查询不到了

SQL> purge recyclebin;
 
Done
 
SQL> select constraint_name,constraint_type,table_name from user_constraints;
 
CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
------------------------------ --------------- ------------------------------
SYS_C00161026                  P               EMP
 
SQL> select object_name,original_name,type from recyclebin;
 
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------


--purge recyclebin之后user_constraints里面相应的约束(怪怪的名字的约束)也已经没掉了


create table dept(deptno number(2) primary key,dname varchar2(20));
create table emp(empno number(4) primary key,ename varchar2(20),deptno number(2));
alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno);
如果drop的是子表(emp表),那么直接drop table emp;就可以了,不用cascade constraints,也会把相应的表上的约束

和索引都删除掉

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26524307/viewspace-1061280/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26524307/viewspace-1061280/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值