Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy mogę mieć ograniczenie dotyczące liczby odrębnych wartości w kolumnie w SQL?

Nie można tego zrobić za pomocą samego ograniczenia sprawdzającego, ale istnieje sposób na użycie zmaterializowanego widoku i ograniczenia sprawdzającego, jak demonstruję tutaj na moim blogu . Dla twojego przykładu byłoby to:

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;

Jednak to podejście może nie być skuteczne w przypadku dużej, zajętej produkcyjnej bazy danych, w takim przypadku można wybrać podejście, które wykorzystuje wyzwalacze i ograniczenie sprawdzające oraz dodatkową kolumnę w tabeli Pracownicy:

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 usuwa dane ze zdalnej tabeli SQL Server

  2. Prosty sposób na uruchomienie skryptu sqlplus z java

  3. Zmaterializowany widok i tabela o tej samej nazwie

  4. Konwertuj Unixtime na Datetime SQL (Oracle)

  5. Zliczaj kolejne dni spełniające podane kryteria