- 總結
在刪除有父子表關系的表的數據時,我們都知道要先刪除子表 再刪除父表數據。
昨天采用先刪子表 ,再刪父表,刪除時使用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