Oracle
 sql >> база данни >  >> RDS >> Oracle

Мога ли да имам ограничение за броя на различни стойности в колона в SQL?

Това не може да се направи само с помощта на ограничение за проверка, но има начин да се използва материализиран изглед и ограничение за проверка, както демонстрирам тук в моя блог . За вашия пример това би било:

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при несъответствие на набор от знаци в Oracle

  2. Oracle 12.2 Sharding

  3. ORA-00907:липсва дясна скоба

  4. T-SQL:Как можете да създадете таблица с SELECT?

  5. ORA-00904:Добър курорт:невалиден идентификатор