status
Postgres表中有一列只能有两个值:Active
和Inactive
.
其中一列被命名userid
.该表可以有多个相同的行,userid
但最多只能有一行status = 'Active'
.我只需要一个或没有status
为Active
每userid
.如何使用此条件创建约束?我在Postgres文档中找不到任何帮助.
就像@ 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'