2014-02-19 54 views
0

只要組成它的列的各個值是唯一的(如在列值中單獨評估),組合鍵就保證是唯一的,或者它是結果值(如串聯的列值)這是否構成關鍵並且必須是獨一無二的?如何評估組合鍵?

會,例如,下面的兩行導致相同的密鑰,或者將它們都被認爲是唯一的,因此允許:

PRIMARY KEY (user_id, friend_id) 

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

現在,我顯然沒有數據庫專家,它實際上是在第一次我正在考慮使用組合鍵(以前從來沒有理由),所以它可能是「每個人」都知道或在文檔中很容易找到的東西,但我一直無法找到答案到它。

你希望上面的例子能夠工作(在邏輯上,爲什麼不應該呢?這些單獨的值肯定是唯一的),但是我在我繼續我的項目之前真的很想確定。

+0

我不知道,但我認爲這是很明顯,你不能告訴複合PK是獨一無二的,如果它的列連接是獨一無二的:-),因爲這不是複合PK的概念。現在,你可能會爭辯說,一些INDEX(使查詢更快)可以使用複合PK列的連接來計算一些散列(在這種情況下,即使這個散列不是唯一的,當然,儘管好的散列函數試圖儘可能傳播其價值觀以加快搜索速度)。 – Leo

+0

現在,如果你想加快你的複合PK檢查使用INDEXES,那麼你的關於PostgreSQL複合PK評估內部的問題可以在這裏適合:-) IMO – Leo

回答

2

A PRIMARY KEY約束由UNIQUE索引在所涉及的列上加上NOT NULL約束在所有涉及的列上執行。

「唯一」意味着所有列的組合都是唯一的。你所擔心的是兩個值的文本表示的連接('10' || '283') = ('1028' || '3')但這並不是複合類型如何操作。所有字段都被分開考慮,並作爲定義數據類型的值,而不是作爲文本表示。

NULL值永遠不會被認爲是相等的,但是那些在pk列中是不允許的。

列的順序與性能相關。伴隨的綜合指數偏好是主要的欄目。在此密切相關的答案更多細節:
PostgreSQL composite primary key

+0

太好了。謝謝!這就是我的想法,並希望它能起作用,但之前我一直無法找到答案,所以只能肯定。並感謝您的鏈接,以及。清理了一些東西。 – Tom

1

每個唯一約束(包括主鍵約束)都要求關係中的每一行都對投影到約束中指定的屬性進行函數依賴。

它的意思是說,在你的榜樣,

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

都是允許的;因爲沒有<user_id, friend_id>出現不止一次。鑑於上述情況,您不能再有其他<1, 1>,因爲它會與第一行發生衝突。