Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Posso ter uma restrição na contagem de valores distintos em uma coluna no SQL?


Isso não pode ser feito usando apenas uma restrição de verificação, mas há uma maneira de usar uma visualização materializada e uma restrição de verificação conforme demonstro aqui no meu blog . Para o seu exemplo seria:
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;

No entanto, essa abordagem pode não funcionar em um banco de dados de produção grande e ocupado; nesse caso, você pode optar por uma abordagem que usa gatilhos e uma restrição de verificação, além de uma coluna extra na tabela de funcionários:
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;