Oracle 外鍵約束


下面的語句創建department_20表,並定義和啟用department_id列上的外鍵,該外鍵引用departments表的department_id列上的主鍵:

CREATE TABLE dept_20 
   (employee_id     NUMBER(4), 
    last_name       VARCHAR2(10), 
    job_id          VARCHAR2(9), 
    manager_id      NUMBER(4), 
    hire_date       DATE, 
    salary          NUMBER(7,2), 
    commission_pct  NUMBER(7,2), 
    department_id   CONSTRAINT fk_deptno 
                    REFERENCES departments(department_id) ); 

 

約束fk_deptno確保dept_20表中為員工指定的所有部門都存在於departments表中。但是,員工可以擁有空的部門編號,這意味着他們沒有分配給任何部門。為了確保所有員工都被分配到一個部門,除了引用約束之外,您還可以在dept_20表的department_id列上創建一個非空約束。

在定義和啟用此約束之前,必須定義並啟用departments表的department_id列的主鍵或唯一約束。

外鍵約束定義不使用foreign key子句,因為約束是以內聯方式定義的。不需要Department_ID列的數據類型,因為Oracle會自動為此列分配引用鍵的數據類型。

約束定義標識被引用鍵的父表和列。因為被引用的鍵是父表的主鍵,所以被引用的鍵列名是可選的。

或者,您可以不按行定義此外鍵約束:

CREATE TABLE dept_20 
   (employee_id     NUMBER(4), 
    last_name       VARCHAR2(10), 
    job_id          VARCHAR2(9), 
    manager_id      NUMBER(4), 
    hire_date       DATE, 
    salary          NUMBER(7,2), 
    commission_pct  NUMBER(7,2), 
    department_id, 
   CONSTRAINT fk_deptno 
      FOREIGN  KEY (department_id) 
      REFERENCES  departments(department_id) ); 

 

此語句兩個變體中的外鍵定義都省略了on delete子句,從而導致Oracle在某個部門中有員工工作時,阻止刪除該部門。

ON DELETE 示例

此語句創建dept_20表,定義並啟用兩個引用完整性約束,並使用on delete子句:

CREATE TABLE dept_20 
   (employee_id     NUMBER(4) PRIMARY KEY, 
    last_name       VARCHAR2(10), 
    job_id          VARCHAR2(9), 
    manager_id      NUMBER(4) CONSTRAINT fk_mgr
                    REFERENCES employees ON DELETE SET NULL, 
    hire_date       DATE, 
    salary          NUMBER(7,2), 
    commission_pct  NUMBER(7,2), 
    department_id   NUMBER(2)   CONSTRAINT fk_deptno 
                    REFERENCES departments(department_id) 
                    ON DELETE CASCADE ); 

 

由於第一個on delete子句,如果從Employees表中刪除了經理編號2332,則Oracle將dept_20表中以前擁有經理2332的所有員工的經理ID值設置為空。

由於存在第二個on delete子句,Oracle將departments表中department_id值的任何刪除操作級聯到department_20表中依賴行的department_id值。例如,如果從Departments表中刪除Department 20,則Oracle將從Department_20表中刪除Department 20中的所有員工。

復合外鍵約束示例

以下語句定義並啟用dept_20表的employee_id和hire_date列組合的外鍵:

ALTER TABLE dept_20
   ADD CONSTRAINT fk_empid_hiredate
   FOREIGN KEY (employee_id, hire_date)
   REFERENCES hr.job_history(employee_id, start_date)
   EXCEPTIONS INTO wrong_emp;

約束fk_empid_hiredate確保dept_20表中的所有員工都具有員工表中存在的員工ID和雇用日期組合。在定義和啟用此約束之前,必須定義並啟用一個約束,該約束將Employees表的Employee_ID和Hire_Date列的組合指定為主鍵或唯一鍵。

EXCEPTIONS INTO 子句導致Oracle將有關dept_20表中違反約束的任何行的信息寫入 wrong_emp表。如果 wrong_emp 異常表不存在,則此語句將失敗。


免責聲明!

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



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