外來鍵約束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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Drop table cascade constraintsAI
- DROP TABLE ** CASCADE CONSTRAINTS PURGEAI
- 主子表drop table constraints cascade的測試AI
- Javaweb-約束-外來鍵約束JavaWeb
- Oracle定義約束 外來鍵約束Oracle
- SQL的主鍵和外來鍵約束SQL
- 教你mysql如何增加外來鍵約束MySql
- oracle外來鍵約束的總結Oracle
- MySQL禁用恢復外來鍵約束MySql
- mysql 刪除老是報外來鍵約束MySql
- AppBoxFuture(七): 分散式外來鍵約束APP分散式
- mysql不能新增外來鍵約束怎麼辦MySql
- SQL外來鍵約束的含義及建立SQL
- mysql啟動和關閉外來鍵約束MySql
- Oracle外來鍵約束中NULL的處理OracleNull
- 詳解外來鍵約束(foreign key)
- 【實驗】【外來鍵】小議外來鍵約束對應用程式的影響
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- PostgreSQL11preview-支援陣列外來鍵約束SQLView陣列
- SQL SERVER中找出拙劣的約束,索引,外來鍵SQLServer索引
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- 修改外來鍵為validate時需要驗證資料是否符合外來鍵約束
- mysql資料庫匯入外來鍵約束問題MySql資料庫
- 遷移後處理外來鍵約束的問題
- mysql~資料完整性考慮~外來鍵約束MySql
- Oracle constraints type 約束型別OracleAI型別
- Oracle基礎 11 約束 constraintsOracleAI
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- 查詢外來鍵約束、子表欄位等資訊的SQLSQL
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- 解決無法刪除表,提示被外來鍵約束引用
- MySQL·捉蟲動態·DROPDATABASE外來鍵約束的GTIDBUGMySqlDatabaseTiDB
- 查詢(看)表的主鍵、外來鍵、唯一性約束和索引索引
- 關於外來鍵約束和對應主鍵資訊的查詢指令碼指令碼
- oracle主外來鍵鎖_lock_約束Oracle
- 【Foreign Key】Oracle外來鍵約束三種刪除行為Oracle
- (轉)oracle資料庫中所有外來鍵約束失效SQL語句Oracle資料庫SQL