【发布时间】:2012-02-04 22:23:43
【问题描述】:
表:亲戚
-
emp_id -
dep_id(复合主键)
我们必须将一名员工限制为三名家属。
【问题讨论】:
-
为什么不创建一个触发器呢?
标签: sql oracle constraints
表:亲戚
emp_id
dep_id(复合主键)我们必须将一名员工限制为三名家属。
【问题讨论】:
标签: sql oracle constraints
添加一个新的整数非空列occurrence,添加一个检查约束occurrence BETWEEN 1 AND 3,在emp_id 和occurrence 的复合上添加一个唯一约束,可选地添加辅助过程来维护occurrence 值。
【讨论】:
这不能单独使用检查约束来完成,但有一种方法可以使用物化视图和检查约束,正如我所演示的 here on my blog。对于您的示例,这将是:
create materialized view emp_dep_mv
build immediate
refresh complete on commit as
select emp_id, count(*) cnt
from relatives
group by emp_id;
alter table emp_dep_mv
add constraint emp_dep_mv_chk
check (cnt <= 3)
deferrable;
但是,这种方法在大型、繁忙的生产数据库中可能性能不佳,在这种情况下,您可以选择使用触发器和检查约束的方法,并在 employees 表上加上一个额外的列:
alter table employees add num_relatives number(1,0) default 0 not null;
-- Populate for existing data
update employees
set num_relatives = (select count(*) from relatives r
where r.emp_id = e.emp_id)
where exists (select * from relatives r
where r.emp_id = e.emp_id);
alter table employees add constraint emp_relatives_chk
check (num_relatives <= 3);
create trigger relatives_trg
after insert or update or delete on relatives
for each row
begin
if inserting or updating then
update employees
set num_relatives = num_relatives + 1
where emp_id = :new.emp_id;
end if;
if deleting or updating then
update employees
set num_relatives = num_relatives - 1
where emp_id = :old.emp_id;
end if;
end;
【讨论】: