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;
    

    ただし、このアプローチは、大規模でビジーな本番データベースでは実行できない可能性があります。その場合、トリガーとチェック制約に加えて、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;
    


    1. *と別の列の選択方法

    2. データベースを削除できません

    3. Oracleのto_charでフォーマットされていない文字をエスケープする最良の方法は何ですか?

    4. MySql:複数の左結合が間違った出力を与える