Могу ли я иметь ограничение на количество различных значений в столбце в SQL? - PullRequest
4 голосов
/ 07 января 2012

Таблица: Родственники

  • emp_id
  • dep_id (составной первичный ключ)

Мы должныограничить одного работника тремя иждивенцами.

Ответы [ 2 ]

8 голосов
/ 07 января 2012

Этого нельзя сделать, используя только проверочное ограничение, но есть способ с использованием материализованного представления и проверочного ограничения, как я демонстрирую здесь, в моем блоге .Для вашего примера это будет:

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;

Однако этот подход может быть неэффективным в большой, занятой производственной базе данных, и в этом случае вы можете использовать подход, использующий триггеры и проверочное ограничение, плюсдополнительный столбец в таблице сотрудников:

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;
3 голосов
/ 09 января 2012

Добавить новое целое число, а не столбец NULL occurrence, добавить проверочное ограничение occurrence BETWEEN 1 AND 3, добавить уникальное ограничение на соединение emp_id и occurrence, при желании добавить вспомогательные процессы для поддержки значений occurrence.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...