ORA-02266: 表中的唯一/主鍵被啟用的外鍵引用


  • 總結

在刪除有父子表關系的表的數據時,我們都知道要先刪除子表 再刪除父表數據。

昨天采用先刪子表 ,再刪父表,刪除時使用truncate,結果在刪除父表的時候,給出了這個提示:ORA-02266這個錯誤提示。

當采用delete 語句刪除父表的數據時候,則成功。

根本問題是 :ddl與dml 的區別(because truncate isn't going to verify the constraint, truncate is ddl.)

這里需要如下操作

   先取消子表外鍵的外鍵約束,之后刪除父表數據,最后再次啟用外鍵約束.

  • 准備工作 父子表建立過程
-- 創建person表
create   table PERSON (
       PID INTEGER PRIMARY KEY,
       PNAME VARCHAR2(10) NOT NULL 
)TABLESPACE CICI;
-- 創建 department
create table DEPARTMENT (
       DEPID INTEGER PRIMARY KEY,
       DEPTNAME VARCHAR2(10) NOT NULL 
)TABLESPACE CICI;
-- 添加字段
alter table PERSON add DEPID INTEGER ;
-- 添加外鍵約束 person -->department
--              deptid -- >deptid
ALTER TABLE PERSON
ADD CONSTRAINT fk_PERSON_DEPT
FOREIGN KEY (DEPID) REFERENCES DEPARTMENT (DEPID);
  • 問題產生 執行如下語句
TRUNCATE TABLE PERSON;
--執行成功
TRUNCATE TABLE DEPARTMENT;
--遇到錯誤提示 :ORA-02266: 表中的唯一/主鍵被啟用的外鍵引用
  • 問題解決

DISTABLE 子表的FK外鍵約束,刪除數據后,再ENTABLE;

 1 查詢外鍵約束

select * from ALL_CONSTRAINTS
WHERE constraint_type='R' and owner='SS_HR';

得到constraint_name 為:FK_PERSON_DEPT

2 失效子表的外鍵約束

ALTER TABLE  PERSON DISABLE CONSTRAINT FK_PERSON_DEPT ;

 3 再次執行刪除父表數據的操作

TRUNCATE TABLE DEPARTMENT;

4 生效外鍵約束

ALTER TABLE  PERSON enable CONSTRAINT FK_PERSON_DEPT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM