Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tôi có thể có ràng buộc về số lượng các giá trị khác nhau trong một cột trong SQL không?

Điều này không thể được thực hiện chỉ bằng cách sử dụng ràng buộc kiểm tra, nhưng có một cách sử dụng chế độ xem cụ thể hóa và ràng buộc kiểm tra như tôi chứng minh đây trên blog của tôi . Đối với ví dụ của bạn, điều này sẽ là:

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;

Tuy nhiên, cách tiếp cận này có thể không hiệu quả trong cơ sở dữ liệu sản xuất lớn và bận rộn, trong trường hợp đó, bạn có thể sử dụng cách tiếp cận sử dụng trình kích hoạt và ràng buộc kiểm tra, cộng với một cột bổ sung trên bảng nhân viên:

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 có lưu trữ các số 0 ở cuối cho kiểu dữ liệu Số không?

  2. Làm thế nào để giải quyết ORA 00936 Lỗi biểu thức thiếu?

  3. Các tham số utl_file.fopen trong Oracle

  4. Lỗi ORA 00904:Số nhận dạng không hợp lệ

  5. tính năng tự động gia tăng oracle với trình tự và trình kích hoạt không hoạt động chính xác