当前位置: 首页 > 知识库问答 >
问题:

Postgresql:条件唯一约束

谭嘉歆
2023-03-14

我想添加一个约束,只在表的一部分中对列强制唯一性。

ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);

上面的WHERE部分是一厢情愿的想法。

有办法吗?还是应该回到关系绘图板?

共有2个答案

沈树
2023-03-14

已经有人说PG没有定义部分(即条件)唯一约束。文档还指出,向表中添加唯一约束的首选方法是addconstraintunique index

向表中添加唯一约束的首选方法是ALTER table。。。添加约束。使用索引强制执行唯一约束可以被视为一个不应直接访问的实现细节。然而,人们应该知道,没有必要在唯一的列上手动创建索引;这样做只会复制自动创建的索引。

有一种方法可以使用排除约束来实现它(感谢@dukelion提供了这个解决方案)

在你的情况下看起来会像

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);
扈高逸
2023-03-14

PostgreSQL不定义部分(即有条件的)UNIQUE约束,但是,您可以创建部分唯一索引

PostgreSQL使用唯一的索引来实现唯一的约束,所以效果是一样的,但有一个重要的警告:您不能像对唯一的约束那样对唯一的索引执行upserts(ON CONFLICT DO UPDATE)。

此外,您不会看到information_schema中列出的约束。

CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);

参见部分索引。

 类似资料:
  • 我遇到一个情况,需要根据另一个列值对一个列[属性]强制执行唯一约束。 例如,我有一个像table(ID,EID,Name,ISDeleted)这样的表 ISDeleted只能有一个值null或'y'(active或deleted),并且我想在EID上创建一个唯一的约束,仅当ISDeleted=null时才创建ISDeleted,因为我不关心是否有多个具有相同ID的已删除记录。请注意,EID可以为空

  • 我的应用程序中不断出现此错误 重复的键值违反唯一约束“product\u supplierinfo\u pkey”详细信息:键(id)=(409)已存在。 这在表product_supplierinfo中。 关键约束需要的实际下一个序列号是5461,而不是409。 有人能告诉我更新此密钥唯一约束的正确查询吗?

  • 当尝试使用PostgreSQL执行时,我遇到了一个我不理解的行为。文档似乎指示语句的冲突目标可以是索引表达式或约束名称。但是,当试图引用约束名称时,我得到了一个“列...不存在”错误。 我的第一次尝试是创建一个索引,它可以很好地处理约束推理: 在描述上表时,我在“索引”下看到了以下内容: 我的第二次尝试是将唯一约束显式地放在创建表中: 在描述上表时,“索引:”的输出略有不同(“唯一约束”与前一示例

  • 问题内容: 我有一个用户表,例如: 和一张有工作的桌子: 可以将作业分配给用户,但只能分配给超级用户。其他用户无法分配作业。 因此,我有一个表格,通过它可以查看将哪个作业分配给了哪个用户: 但是我想创建一个检查约束,该约束引用具有的用户。 那可能吗?还是有其他解决方案? 问题答案: 这将适用于INSERTS: 然后在user_has_job表上检查约束: 适用于插入物: 但是,这是可能的: 因此,

  • 以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。

  • 主要内容:在创建表时设置唯一约束,在修改表时添加唯一约束,删除唯一约束MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。 唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但