Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 添加约束以使列在每组行中唯一_Database_Postgresql_Constraints_Unique Index_Partial Index - Fatal编程技术网

Database 添加约束以使列在每组行中唯一

Database 添加约束以使列在每组行中唯一,database,postgresql,constraints,unique-index,partial-index,Database,Postgresql,Constraints,Unique Index,Partial Index,Postgres表中有一列status,该列只能包含两个值:Active和Inactive 其中一列名为userid。该表可以有多行具有相同的userid,但最多只能有一行具有status='Active'。我只需要一个或不需要状态作为活动每个用户ID。如何使用此条件创建约束?我在Postgres文档中找不到任何帮助。比如,状态应该是。更便宜,更干净 无论哪种方式,您都可以通过以下方式实施您的规则: 要在整个表中允许零行或一行的状态为“活动”: 要允许每个userid有零行或一行status='

Postgres表中有一列
status
,该列只能包含两个值:
Active
Inactive

其中一列名为
userid
。该表可以有多行具有相同的
userid
,但最多只能有一行具有
status='Active'
。我只需要一个或不需要
状态
作为
活动
每个
用户ID
。如何使用此条件创建约束?我在Postgres文档中找不到任何帮助。

比如,
状态应该是。更便宜,更干净

无论哪种方式,您都可以通过以下方式实施您的规则:

要在整个表中允许零行或一行的状态为“活动”

要允许每个
userid
有零行或一行
status='Active'
,请将
userid
设为索引列:

CREATE UNIQUE INDEX tbl_userid_active_uni ON tbl (userid)
WHERE status = 'Active';
请注意,
userid为NULL
不会触发唯一的冲突,因为两个NULL值从未被视为相等<在这种情况下,code>userid必须为空

为什么索引而不是约束? 解决您的问题:这是一个索引,而不是一个索引

第一种情况的索引是极小的,包含一行或不包含任何行。
第二种情况的索引为每个现有的
用户ID保存一行,但它是最便宜、最快的方法,而且干净、安全。在任何情况下,您都需要一个索引来检查其他行,以加快速度

不能对其他行进行
检查
约束检查-至少不能以干净、可靠的方式进行。对于这种情况,我当然不推荐以下方法:


如果对
(userid,status)
(也在后台使用唯一索引实现!)使用
UNIQUE
约束,则不能将其设置为部分,所有组合都强制为唯一。如果您在所有情况下使用的
状态为空
,除了
的“活动”
情况,您仍然可以使用此选项。但这实际上会增加一个更大的索引,包括所有行。

最好添加布尔类型的列
IsActive
,而不是存储
VARCHAR
,或者如果您有更多的状态,请使用INT类型并添加查找表。这是一个更好的选择,但我不能更改它,因为整个数据库结构都遵循这一点。因此,此表中可以有多条记录具有相同的用户ID?而这个表的意义/意图是什么,某种状态日志?@joop类似于聊天状态。一个用户可以在数据库中保存多个状态,但一次只能使用一个。我不知道“聊天状态”是什么。您可以在问题中添加一些示例数据,以显示您拥有什么以及您想要什么。虽然解决方案可行,但它不是索引而不是约束。我的意思是创建索引使用额外的内存以有序的方式保存列数据。使用索引代替约束可以吗?@ShashwatKumar:请参阅上面的补充说明。解决方案似乎不起作用。我正在添加两个具有相同用户id和非活动状态的行,但在第二次插入时,它给出了重复键错误。当我使用检查表信息时\d显示。。。“tb1_userid_key”唯一约束,btree(userid)。在这种情况下,表中显然不接受相同的用户ID。@ShashwatKumar:使用唯一约束
所有组合都被强制为唯一的
。我建议改为使用部分唯一索引。请再读一遍。我使用了与你相同的命令。唯一的约束就是这个结果。
CREATE UNIQUE INDEX tbl_userid_active_uni ON tbl (userid)
WHERE status = 'Active';