设置PostgreSQL中两个唯一字段的约束

设置PostgreSQL中两个唯一字段的约束,postgresql,constraints,Postgresql,Constraints,我是博士后的新手。我想知道,PostgreSQL是如何为两个唯一的值设置约束的(这样每对值都是唯一的)。我是否应该为bar和baz字段创建索引 CREATE UNIQUE INDEX foo ON table_name(bar, baz); 如果没有,什么是正确的方法?提前感谢。您可以做您已经想到的事情:在两个字段上创建一个唯一的约束。这样,将在幕后创建一个唯一索引,您将获得所需的行为。此外,可以通过information\u schema提取这些信息,以便在必要时根据两者都必须是唯一的这一事

我是博士后的新手。我想知道,PostgreSQL是如何为两个唯一的值设置约束的(这样每对值都是唯一的)。我是否应该为
bar
baz
字段创建
索引

CREATE UNIQUE INDEX foo ON table_name(bar, baz);

如果没有,什么是正确的方法?提前感谢。

您可以做您已经想到的事情:在两个字段上创建一个唯一的约束。这样,将在幕后创建一个唯一索引,您将获得所需的行为。此外,可以通过
information\u schema
提取这些信息,以便在必要时根据两者都必须是唯一的这一事实进行一些元数据推断。我会推荐这个选择。您也可以为此使用触发器,但对于此特定要求,唯一约束要好得多。

如果每个字段需要对其自身唯一,请在每个字段上创建唯一索引。如果它们只需要在组合中是唯一的,那么在两个字段之间创建一个唯一的索引

如果每个字段应该为空,请不要忘记将其设置为非空。空值从来都不是唯一的,因此可能会发生以下情况:

create table test (a int, b int);
create unique index test_a_b_unq on test (a,b);
insert into test values (NULL,1);
insert into test values (NULL,1);

并且没有错误。因为这两个空值不是唯一的。

谢谢,是的,为它创建一个触发器有点苛刻。最好使用
唯一的
约束。这将在幕后创建唯一索引,但与直接创建唯一索引不同,它在
信息\u模式中作为元数据可见,并可由工具使用。尝试
ALTER TABLE tname ADD CONSTRAINT bar_baz_unique unique(bar,baz)或在原始表定义中,只需添加额外的一行
约束栏_baz_unique(bar,baz)@CraigRinger太糟糕了,我没有看到,因为你的留言里没有提到我的名字。我认为这确实是一种更明显的语法,也是一种更好的方法,你应该写一个答案,而不是评论。@JohnDoe应该提到,是的。不过,只要看到巴勃罗答案的人看到了,那就好了。如果他修改他的答案以包含更好的风格,那就更好了。谢谢@CraigRinger:完全同意你的观点。