当前位置:  开发笔记 > 编程语言 > 正文

添加约束以使每列行的列唯一

如何解决《添加约束以使每列行的列唯一》经验,为你挑选了1个好方法。

statusPostgres表中有一列只能有两个值:ActiveInactive.

其中一列被命名userid.该表可以有多个相同的行,userid但最多只能有一行status = 'Active'.我只需要一个或没有statusActiveuserid.如何使用此条件创建约束?我在Postgres文档中找不到任何帮助.



1> Erwin Brands..:

就像@ lad2025评论的那样,status应该是真的boolean.更便宜,更清洁.

无论哪种方式,您都可以使用部分唯一索引强加您的规则:

status = 'Active' 在整个表中允许零行或一行:

CREATE UNIQUE INDEX tbl_active_uni ON tbl (status)
WHERE status = 'Active';

要使用status = 'Active' peruserid允许零行或一行 ,请创建userid索引列:

CREATE UNIQUE INDEX tbl_userid_active_uni ON tbl (userid)
WHERE status = 'Active';

请注意,userid IS NULL不会触发唯一的违规,因为两个NULL值永远不会被视为相等.userid必须在这种情况下设置NOT NULL.

如何在PostgreSQL上添加条件唯一索引

使用空列创建唯一约束

为什么索引而不是约束?

在评论中解决您的问题:这是一个索引,而不是一个CONSTRAINT.

第一种情况的索引很小,只有一行或没有行.
第二种情况的索引每个现有一行userid,但它是最便宜和最快的方式,除了干净和安全.在任何情况下,您都需要一个索引来检查其他行以使其快速.

您不能CHECK对其他行进行约束检查 - 至少不能以干净,可靠的方式进行.对于这种情况,有些方法我肯定不会推荐:

触发与检查约束

如何避免3个表之间的循环依赖(循环引用)?

恢复转储时禁用所有约束和表检查

如果使用UNIQUE约束(userid, status)(在后台也使用唯一索引实现!),则不能使其成为局部,并且所有组合都被强制为唯一.如果您处理除案例之外的所有情况,您仍然可以使用此功能.但这实际上会产生一个更大的索引,包括所有行.status IS NULL'Active'

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有