复合键是否保证唯一,只要它所包含的列的各个值是唯一的(如在列值中单独计算),或者是结果值(如列值的串联) )构成关键并且必须是唯一的?
例如,以下两行会产生相同的密钥,或者它们都会被视为唯一的,因此允许:
PRIMARY KEY (user_id, friend_id)
|-----------|-------------|
| user_id | friend_id |
|-----------|-------------|
| 10 | 283 |
| 1028 | 3 |
|-----------|-------------|
现在,我显然不是数据库专家,这实际上是我第一次考虑使用复合键(之前没有理由),所以它可能是“每个人”都知道或者只是非常容易在文档中找到,但我一直无法找到答案。
你希望上面的例子可以工作(逻辑上,为什么不应该呢?单独的值肯定是唯一的),但我真的想确定在继续我的项目之前。
答案 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>
,因为它会与第一行发生冲突。