2011-11-29 129 views
1

我有兩個表:添加約束在PL/SQL

Employee(eid, ename, age..) 
Department(deptid, dname, managerid..) //manager id references eid 

我如何創建部門表的約束,使得經理人的年齡總是> 25?

回答

7

約束不能包含子查詢,因此如果要在數據庫級別實施此業務規則,則需要觸發器。像這樣的東西。

create or replace trigger dep_briu_trg 
    before insert or update on department 
    for each row 
declare 
    l_age employee.age%type; 

    begin 
     select age 
     into l_age 
     from empoyee 
     where id=:new.managerid; 

     if l_age<=25 then 
     raise application_error(-20000,'Manager is to young'); 
     end if; 
    exception 
     when no_data_found then 
     raise application_error(-20000,'Manager not found'); 
    end; 

順便說一句不要在表中存儲年齡。每天都不一樣。

+1

,當然,這觸發不會拿起如果員工的年齡隨後修正爲少於25。 –

7

在Oracle 11g中,你可以使用一個虛擬列是一個外鍵的目標:

CREATE TABLE emp (eid NUMBER PRIMARY KEY, 
        age NUMBER NOT NULL, 
        eligible_mgr_eid AS (CASE WHEN age > 25 THEN eid ELSE NULL END) UNIQUE 
       ); 

CREATE TABLE dept (did NUMBER PRIMARY KEY, 
        mgr_id NUMBER NOT NULL REFERENCES emp (eligible_mgr_eid));