Oracle
 sql >> Base de données >  >> RDS >> Oracle

Puis-je avoir une contrainte sur le nombre de valeurs distinctes dans une colonne en SQL ?

Cela ne peut pas être fait en utilisant une contrainte de vérification seule, mais il existe un moyen d'utiliser une vue matérialisée et une contrainte de vérification comme je le démontre ici sur mon blog . Pour votre exemple, ce serait :

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;

Cependant, cette approche peut ne pas être performante dans une grande base de données de production très fréquentée, auquel cas vous pouvez opter pour une approche qui utilise des déclencheurs et une contrainte de vérification, ainsi qu'une colonne supplémentaire sur la table des employés :

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;