【问题标题】:Can I have a constraint on count of distinct values in a column in SQL?我可以限制 SQL 列中不同值的计数吗?
【发布时间】:2012-02-04 22:23:43
【问题描述】:

表:亲戚

  • emp_id
  • dep_id(复合主键)

我们必须将一名员工限制为三名家属。

【问题讨论】:

标签: sql oracle constraints


【解决方案1】:

添加一个新的整数非空列occurrence,添加一个检查约束occurrence BETWEEN 1 AND 3,在emp_idoccurrence 的复合上添加一个唯一约束,可选地添加辅助过程来维护occurrence 值。

【讨论】:

    【解决方案2】:

    这不能单独使用检查约束来完成,但有一种方法可以使用物化视图和检查约束,正如我所演示的 here on my blog。对于您的示例,这将是:

    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;
    

    但是,这种方法在大型、繁忙的生产数据库中可能性能不佳,在这种情况下,您可以选择使用触发器和检查约束的方法,并在 employees 表上加上一个额外的列:

    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;
    

    【讨论】:

    • 我不满意...我的要求首先需要一个简单的约束(在创建表期间)...一种由内而外的方法...我认为这在 row- 是不可能的水平,还是这样?
    • 您是对的:您的要求无法满足。不可能只创建一个简单的约束来强制执行此规则。
    • onedaywhen 的答案的修订版应该可以解决问题。
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 2018-03-21
    • 2011-06-20
    • 2018-08-24
    • 2012-02-27
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多