postgresql 2列上的UNIQUE允许在Postgres中重复

bf1o4zei  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

我有一个多对多表,它将person表连接到自身:

CREATE TABLE IF NOT EXISTS friendship(
    person_id INTEGER NOT NULL,
    friend_id INTEGER NOT NULL,
    date_friendship DATE NOT NULL DEFAULT CURRENT_DATE,
    PRIMARY KEY(person_id, friend_id),
    FOREIGN KEY(person_id) REFERENCES person(id),
    FOREIGN KEY(friend_id) REFERENCES person(id),
    UNIQUE(friend_id, person_id)
);

INSERT INTO friendship (person_id, friend_id)
VALUES (1, 2),
        (1, 3),
        (2, 3),
        (4, 2);

应该禁止插入像(person_id,friend_id)(2,1)这样的行。因为我们已经插入了(1,2)。我的意思是如果1是2的朋友,那么2也是1的朋友。
我无法强制这样的约束。我尝试了UNIQUE(friend_id, person_id),但仍然可以插入:

INSERT INTO friendship (person_id, friend_id)
VALUES (2, 1);

我应该如何处理这种情况?我应该使用不同的数据库吗?

eanckbw9

eanckbw91#

您可以在两个值的“规范化”组合上创建唯一索引:

create unique index  
   on friendship (least(person_id,friend_id), greatest(person_id, friend_id) );

然后,您可以从表定义中删除unique(friend_id, person_id)

相关问题