下面的語句創建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 異常表不存在,則此語句將失敗。