如何在PostgreSQL中通过某些参数使字符串唯一?[duplicate]

pcww981p  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(114)
    • 此问题在此处已有答案**:

Postgresql enforce unique two-way combination of columns(2个答案)
昨天关门了。
示例:假设我们有一个friends表,包含user_id、friend_id、status列,我们需要能够添加:
| 用户标识|好友标识|地位|
| - ------|- ------|- ------|
| 三个|1个|假|
| 三个|第二章|假|
| 三个|四个|假|
但不可能再加上:
| 用户标识|好友标识|地位|
| - ------|- ------|- ------|
| 1个|三个|假|
| 第二章|三个|假|
| 四个|三个|假|
换句话说,使得ID 1和2、1和3可以相加,而它们的反射2和1、3和1不能相加。
先谢谢你
我试着创建一个user_id和friend_id的组合键,组合键由引用同一个表的外键组成,我也试过,我也试过使这些值唯一,但是在这种情况下我不能添加重复的值;例如1和2、1和3(未添加)。

2eafrhcq

2eafrhcq1#

与大多数多对多关联不同,这种关联是双向的,两个成员都是对等的。
您可以通过检查阻止用户与自己成为朋友:check(user_id <> friend_id).
您可以在不考虑顺序的表达式上使用唯一索引来防止重复的友元关系。例如,创建一个数组和sort it

create extension intarray;

create unique index on friends(
  (sort(array[user_id, friend_id]))
)

用户ID 3/朋友ID 1和用户ID 1/朋友ID 3都将导致[1, 3]
要获得用户好友的完整列表,您需要同时按user_id和friend_id进行搜索。

select count(*)
from friends
where user_id = $1 or friend_id = $1

这表明将它们称为friend1friend2可能更好,以表明关系是双向的。
Demonstration.

相关问题