如何评估复合键?

时间:2014-02-19 19:12:13

标签: postgresql composite-key

复合键是否保证唯一,只要它所包含的列的各个值是唯一的(如在列值中单独计算),或者是结果值(如列值的串联) )构成关键并且必须是唯一的?

例如,以下两行会产生相同的密钥,或者它们都会被视为唯一的,因此允许:

PRIMARY KEY (user_id, friend_id)

|-----------|-------------|
|  user_id  |  friend_id  |
|-----------|-------------|
|    10     |     283     |
|   1028    |      3      |
|-----------|-------------|

现在,我显然不是数据库专家,这实际上是我第一次考虑使用复合键(之前没有理由),所以它可能是“每个人”都知道或者只是非常容易在文档中找到,但我一直无法找到答案。

你希望上面的例子可以工作(逻辑上,为什么不应该呢?单独的值肯定是唯一的),但我真的想确定在继续我的项目之前。

2 个答案:

答案 0 :(得分:3)

PRIMARY KEY约束由UNIQUE索引在所涉及的列上实现,并在所有相关列上加上NOT NULL约束。

“唯一”表示所有列的组合都是唯一的。你担心的是两个值('10' || '283') = ('1028' || '3')的文本表示的连接,但这不是复合类型的运作方式。所有字段都单独考虑,并作为已定义数据类型的值,而不是文本表示。

NULL值永远不会被认为是相等的,但pk列中不允许这些值。

列的顺序与性能相关。随附的复合索引首选列。这个密切相关答案的更多细节:
PostgreSQL composite primary key

答案 1 :(得分:1)

每个唯一约束(包括主键约束)要求关系中的每一行都对约束中指定的属性的投影具有功能依赖性。

这意味着,在您的示例中,

user_id | friend_id
======= | =========
1       | 1
1       | 2
2       | 1
4       | 5

都是允许的;因为<user_id, friend_id>不止一次出现。鉴于上述情况,您不能拥有另一个<1, 1>,因为它会与第一行发生冲突。