新增
.必須先新增父表,才能新增子表.如先新增子表-->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
官網連結拉到最下面有一張表,寫的很清楚
沒有留言:
張貼留言