仅对某些查询实施唯一约束

时间:2018-06-20 02:07:27

标签: sql postgresql

假设我有一个accounts表,并且在该表中有一个profile_id列。我希望能够在具有相同profile_id的列中包含多行,但是我也想说“如果没有其他行具有此profile_id值,则插入”。通常,我会为此使用唯一的约束,但是当我希望profile_id存在时,这没有办法覆盖它。

是否有一种方法(在没有竞争条件的情况下)发生插入错误或如果值已经存在而失败,或者是否有插入操作忽略约束并输入与约束不匹配的值?

1 个答案:

答案 0 :(得分:4)

您可以建立部分索引;这至少是您的问题的部分解决方案。也就是说,定义一列,内容如下:

only_uniques_allowed

然后建立索引:

create unique index unq_t_profile_id_uniques on (profile_id) where only_uniques_allowed;

然后,将only_uniques_allowed设置为true的任何行将在具有此设置的行中具有唯一的profile_id

但是,您实际上并不想强制执行约束,所以也许您想做的事最好在应用程序级别完成。也许这表明您需要不同的数据模型。