限制在数据库中声明一次的记录

时间:2015-12-05 23:33:58

标签: sql postgresql

考虑以下表格:

表:rates 列:idlabel

表:business_rates 列:idrate_idbusiness_id

表:assignment_rates 列:idrate_idassignment_id

业务规则是,ratesbusiness_rates可以声明来自assignment_rates的记录。

例如,rates中的记录id100。它由business_rates声明(例如:{id:1, business_id:1, rate_id:100})。如果有人试图在rate_id=100中添加assignment_rates,则应在数据库层引发异常。

这甚至可以在数据库层执行此操作吗?

1 个答案:

答案 0 :(得分:1)

您应该为business_ratesassignment_rates表创建触发器。 assignment_rates的触发器可能如下所示:

create or replace function assignment_rates_trigger()
returns trigger language plpgsql as $$
begin
    if exists (
        select 1 
        from business_rates 
        where rate_id = new.rate_id)
    then
        raise exception 'Rate % exists in business_rates.', new.rate_id;
    end if;
    return new;
end $$;

create trigger assignment_rates_trigger
before insert or update on assignment_rates
for each row execute procedure assignment_rates_trigger();

insert into assignment_rates values (1, 100, 1);

ERROR:  Rate 100 exists in business_rates.

business_rates的触发器应该类似。

另请阅读:Trigger ProceduresCREATE TRIGGER