有没有一种方法可以防止特定情况下插入而没有唯一性?

时间:2019-05-24 15:05:00

标签: sql postgresql

我正在设置Postgres表来组织公司中的活动商店佣金,并且需要设置规则以防止插入错误。

我试图创建一个没有约束的表,并在Python脚本中设置规则。尽管此解决方案有效,但是它并不能防止我或其他人在尝试更新我的表时弄乱自己。

create table my_store_commissions (
    ID SERIAL PRIMARY KEY ,
    STORE_ID INTEGER,
    COMMISSION NUMERIC,
    IS_ACTIVE BOOLEAN
);

insert into my_store_commissions
values (1,100,0.90, False),
       (2,100,0.89, False),
       (3,100,0.78, False),
       (4,100,0.78, True),

-- This code should not run
insert into my_store_commissions
values (5,100, 0.90, True)

我需要拥有store_id的一个以上is_active = False,但拥有store_id的一个is_active = True

1 个答案:

答案 0 :(得分:3)

您想要的是partial [unique] index。也就是说,具有过滤器的唯一索引:

create unique index unq_my_store_commissions_store_id_active
    on my_store_commissions(store_id)
    where is_active;

请注意,在切换活动存储时,可能很难处理这些问题。您可能需要先停用上一个商店,然后再设置新商店。