2012-05-28 44 views
2

我是新来的postgres。我想知道,什么是PostgreSQL的方式来设置一对独特的值的约束(以便每对都是唯一的)。我应该为barbaz字段创建INDEX字段吗?PostgreSQL中两个唯一字段的设置约束

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

如果不是这样,那么正确的方法是什么?提前致谢。

回答

3

你可以做什么你已经在想:在这两个领域创建的唯一约束。这样,将在幕后创建一个唯一索引,您将获得所需的行为。此外,如果需要,可以通过information_schema获取该信息以做出一些元数据推断,因为两者都需要是唯一的。我会推荐这个选项。你也可以为此使用触发器,但是唯一约束对于这个特定的需求来说更好。

+0

谢谢,是的,创建一个触发器有点苛刻 –

+2

最好使用'UNIQUE'约束。这将在幕后创建一个唯一的索引,但与直接创建唯一索引不同,它在'INFORMATION_SCHEMA'中作为元数据可见并且可以被工具使用。尝试'ALTER TABLE tname ADD CONSTRAINT bar_baz_unique UNIQUE(bar,baz);'或者在原始表定义中只需添加一行'CONSTRAINT bar_baz_unique UNIQUE(bar,baz);'。 –

+1

@CraigRinger太糟糕了,我没有看到,因为我的名字没有在您的消息中提到。我认为它是一个更明显的语法和更好的方式来做到这一点,你应该写一个答案,而不是一个评论。 –

3

如果每个字段都必须是唯一的,则在每个字段上创建唯一索引。如果他们只需要组合唯一,那么在两个字段之间创建一个唯一索引。

不要忘记设置每个字段NOT NULL,如果它应该是。空值永远不会是唯一的,所以类似这样的事情可能发生:

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); 

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

+4

你的意思是NULL总是*唯一的 – Jake