主外來鍵關聯刪除(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));
(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));
(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;
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 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);
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值已經置為空。
EMPNO FNAME LNAME DEPT
---------- -------------------- -------------------- ----------
2 Mary Song
3 Linda Liu 2
4 Linlin Zhang
SQL> select * from dept_test;
DEPTNO DEPTNAME
---------- ------------------------------
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
此時也是禁止清空dept_test表,drop相同。
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
如果想要刪除父表,可以有兩種方法:
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;
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
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
這種刪除表的和上面相同。
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7192724/viewspace-1104299/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視oracle 資料庫中的級聯刪除(delete cascade)Oracle資料庫delete
- oracle delete 分批刪除Oracledelete
- LARGE DELETE快速刪除delete
- delete和truncate刪除的區別delete
- 關於delete cascade的小實驗delete
- 批量刪除MSSQL 中主外來鍵約束SQL
- Set delete() 方法delete
- Sqlserver update\delete用inner join關聯,會update\delete關鍵字後面的表關聯到的行SQLServerdelete
- 請教db4o delete物件後,關聯物件未刪除delete物件
- 淺談Oracle 主外來鍵刪除語法格式Oracle
- Elasticsearch增刪改查 之 —— Delete刪除Elasticsearchdelete
- delete_partition.pl 刪除分割槽delete
- 找回Oracle中Delete刪除的記錄Oracledelete
- Entity Framework Code-First(15):Cascade DeleteFrameworkdelete
- C++中動態建立和刪除陣列(new 和delete)C++陣列delete
- 求主外來鍵的關係
- 檢視主外來鍵關係
- Handler_delete和Com_delete有什麼關係delete
- mysql支援跨表delete刪除多表記錄MySqldelete
- Shift + Delete刪除的檔案如何恢復?delete
- javascript delete運算子刪除array陣列元素JavaScriptdelete陣列
- delete 和 delete [] 的真正區別delete
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- 單表的更新UPDATE和刪除記錄DELETE(二十六)delete
- mysql主外來鍵依賴關係MySql
- python 使用 delete 方法時報錯,可以正常刪除Pythondelete
- delete/truncate刪除資料索引空間問題delete索引
- 簡單幾步教你win10按delete鍵刪除不提示的方法Win10delete
- 利用虛擬列實現虛擬刪除的主外來鍵約束
- 關於高水位線和deletedelete
- [20160704]NULL與主外來鍵問題.txtNull
- MySQL防止delete命令刪除資料的兩種方法MySqldelete
- Oracle 刪除表中重複記錄的DELETE SQLOracledeleteSQL
- Oracle閃回查詢恢復delete刪除資料Oracledelete
- [20140505]刪除直方圖_delete histogram直方圖deleteHistogram
- Oracle中審計刪除(DELETE)操作的觸發器Oracledelete觸發器
- update,delete與INNER JOIN 以及刪除重複資料delete
- Linux命令curl去操作delete去刪除資源Linuxdelete