1
我有兩個表:添加約束在PL/SQL
Employee(eid, ename, age..)
Department(deptid, dname, managerid..) //manager id references eid
我如何創建部門表的約束,使得經理人的年齡總是> 25?
我有兩個表:添加約束在PL/SQL
Employee(eid, ename, age..)
Department(deptid, dname, managerid..) //manager id references eid
我如何創建部門表的約束,使得經理人的年齡總是> 25?
約束不能包含子查詢,因此如果要在數據庫級別實施此業務規則,則需要觸發器。像這樣的東西。
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;
順便說一句不要在表中存儲年齡。每天都不一樣。
在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));
,當然,這觸發不會拿起如果員工的年齡隨後修正爲少於25。 –