2015年11月15日 星期日

FK約束、查詢約束 (DDL 四)

新增

.必須先新增父表,才能新增子表
.如先新增子表-->ORA-02291: 違反完整性限制條件 (ACCOUNT.FK_FKNAME) - 找不到父項索引鍵


刪除

※delete

.必須先刪除子表,才能刪除父表
.如先刪父表-->ORA-02292: 違反完整性限制條件 (ACCOUNT.FK_FKNAME) - 發現子項記錄

※truncate(DDL)

.只能刪除子表
.如刪父表或刪完子表再刪父表都會-->ORA-02266: 已啟用的外來索引鍵參照表格中的唯一索引鍵/主索引鍵

修改

.關聯字段有對應到都不能改
.如修改父表-->ORA-02292: 違反完整性限制條件 (ACCOUNT.FK_FKNAME) - 發現子項記錄
.如修改子表-->ORA-02291: 違反完整性限制條件 (ACCOUNT.FK_FKNAME) - 找不到父項索引鍵

※修改父項時,如沒有子項對應,就可以改
※修改子項時,只能修改父項有的值


DROP TABLE(DDL)

.必須先刪除子表,才能刪除父表
.如先刪父表-->ORA-02449: 外來索引鍵參照表格中的唯一索引鍵/主索引鍵



※測試

DROP TABLE dad PURGE;
CREATE TABLE dad (
    did number(5) PRIMARY KEY,
    dname varchar2(20)
);
    
DROP TABLE son PURGE;
CREATE TABLE son (
    sid number(5) PRIMARY KEY,
    sname varchar2(20),
    did number(5),
    
    CONSTRAINT fk_did FOREIGN KEY(did) REFERENCES dad(did)
);
    
INSERT INTO dad VALUES (1, 'apple');
INSERT INTO dad VALUES (2, 'banana');
INSERT INTO son VALUES (1, 'monkey', 1);
    
DELETE FROM dad WHERE did = 1;

※執行到DELETE那一行,就會出「ORA-02292: 違反完整性限制條件 (帳號.FK_SID) - 發現子項記錄」的錯,因為發現子項記錄,所以就要先把子項記錄刪了,才能刪父項記錄



※ON DELETE CASCADE、ON DELETE SET NULL

ALTER TABLE son DROP CONSTRAINT fk_did;
ALTER TABLE son ADD CONSTRAINT fk_did FOREIGN KEY(sid) REFERENCES dad(did) ON DELETE CASCADE;

※後面增加ON DELETE CASCADE,這樣子刪除父項記錄時,就會將子項記錄刪除了

※如果後面增加的是ON DELETE SET NULL,這樣子刪除父項記錄時,就會將對應的欄位變成null



※DROP TABLE

刪除表時,如果先刪的是父項,就會出「ORA-02449: 外來索引鍵參照表格中的唯一索引鍵/主索引鍵」的錯(因為表有CONSTRAINT,所以不管有沒有記錄都會出這種錯)

如果確定都要刪,就要這樣下「DROP TABLE dad CASCADE CONSTRAINT PURGE;」,此時父表被刪除了,而子表的記錄完全沒影響,記錄沒被刪除,也不會變成null,但子表的FK約束消失了



※查詢約束

USER_CONSTRAINTS、USER_CONS_COLUMNS是查約束用的
CONSTRAINT_TYPE有英文符號,意思如下:
.PRIMARY KEY:P
.UNIQUE KEY:U
.FOREIGN KEY:R
.CHECK、NOT NULL:C
官網連結拉到最下面有一張表,寫的很清楚

沒有留言:

張貼留言