sql >> Database >  >> RDS >> Oracle

Kan ik een beperking hebben op het aantal verschillende waarden in een kolom in SQL?

Dit kan niet worden gedaan met alleen een controlebeperking, maar er is een manier om een ​​gematerialiseerde weergave en een controlebeperking te gebruiken, zoals ik aantoon hier op mijn blog . Voor jouw voorbeeld zou dit zijn:

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;

Deze aanpak is echter mogelijk niet effectief in een grote, drukke productiedatabase, in welk geval u zou kunnen kiezen voor een aanpak die triggers en een controlebeperking gebruikt, plus een extra kolom op de werknemerstabel:

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;


  1. Leg MySQL Joins uit in eenvoudige taal

  2. Gegevensbestand laden, verschil tussen Windows en Linux

  3. JPA @Size annotatie voor BigDecimal

  4. Waarom 'foreign key constraint mislukt' als er een externe sleutel bestaat?