PSQL两列的唯一约束

4

我有一张表格,用于将另外两个表格建立1对多的关系。

TableA
id
name

TableB
id
name

LinkTable
TableA_id
TableB_id

基本上,TableA可以拥有许多TableB。非常简单。我现在面临的问题是创建一个遵循这种关系规则的约束条件,如下:

LinkTable
TableA_id    TableB_id
1            1
1            2
1            3
2            1
2            2
2            3

我希望创建一个唯一约束,将两个列组合在一起作为唯一值。因此,在上面的链接表中,使用这个新约束,我可以

INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 4);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 5);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (2, 6);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (3, 1);

With out any problems

And if I try to insert:

INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 1);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 3);

由于已经存在1,1和1,3的行,所以该约束条件将触发。我如何创建一个postgres约束来实现这一点?如果我为这两个行设置唯一约束,则无法拥有相同的TableA_id和TableB_id。

解决方案是什么?


“约束将被触发,因为已经存在一行具有1,1和1,3。”你在哪里看到这样的行? - Hamlet Hakobyan
@Ozzy - 提醒一下,这不是PL/SQL,而是SQL。所有DDL(如create、alter等)都是SQL的一部分。 - Art
我知道,但是我指定了psql,以防有一种psql独特的编写唯一约束的方式。宁愿安全也不要后悔 :) - Ozzy
2个回答

15

你尝试过将这两列都设置为唯一吗?

ALTER TABLE LinkTable 
ADD CONSTRAINT LinkTable_Unique UNIQUE (TableA_id, TableB_id);

5
create table LinkTable (
    TableA_id integer REFERENCES TableA(id),
    TableB_Id integer REFERENCES TableB(id),
    UNIQUE(tableA_id, tableB_id)
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接