2011-11-14 117 views
4

我是一個新手,我不能把我的頭圍繞主鍵作爲外鍵。對我而言,外鍵意味着將表的兩行連接在一起。因此,在picture表中使用user表的username作爲外鍵是合理的。這意味着該行中的圖片屬於指定的用戶。然而,看來一般慣例傾向於使用無意義的數字作爲主要ID。此外,外鍵必須/應該引用主鍵。如果我不知道主鍵,但是我知道另一個唯一列,在本例中爲username,我將如何從另一個MySQL語句中獲取主鍵,或者將外鍵指向非主鍵?MySQL非主外鍵

回答

7

此外,外鍵必須/應該引用主鍵。如果我不知道主鍵,但是我知道另一個唯一列(在這種情況下爲username),我將如何從另一個MySQL語句中獲取主鍵,或者將外鍵指向非主鍵?

是的,如果你有另一種獨特的鍵,你可以有外鍵引用它:

CREATE TABLE user 
(userid INT NOT NULL 
, username VARCHAR(20) NOT NULL 
--- other fields 
, PRIMARY KEY (userid) 
, UNIQUE KEY (username) 
) ENGINE = InnoDB ; 

CREATE TABLE picture 
(pictureid INT NOT NULL 
, username VARCHAR(20) 
--- other fields 
, PRIMARY KEY (pictureid) 
, FOREIGN KEY (username) 
    REFERENCES user(username) 
) ENGINE = InnoDB ; 

如果在其他表的外鍵所引用這個唯一鍵(username),沒有指出有一個毫無意義的ID。您可以放下它並使表格的usernamePRIMARY KEY

(編輯:) 有幾點對InnoDB表具有自動遞增的主鍵,即使它沒有用作參考,因爲第一個主鍵或唯一索引是默認創建的表的集羣索引。對於INSERTUPDATE語句,主char字段可能具有性能缺陷 - 但在SELECT查詢中執行得更好。


對於討論關於用什麼,替代(無意義的,自動生成的)或自然鍵,以及關於這個問題的不同意見,請閱讀本:surrogate-vs-natural-business-keys

+0

我有一個虛擬主鍵的唯一原因是因爲大家都說這是個好主意。但是,它會使插入非常乏味,因爲您必須去找到用作外鍵的主鍵。 – puk

5

對主鍵使用「無意義」值的原因是「有意義」的值有時會變化的趨勢。

在用戶被重命名的情況下,您不希望去改變其他表中的許多行。這就是爲什麼給他們一個無意義的ID(通常是自動遞增)的習慣做法。

+0

雖然我很欣賞這些信息,可以你可能會添加如何避免使用主ID作爲外鍵? – puk

1

我想你可以將外鍵指向任何一列(或多列),如果在開始時使用這些列創建索引。

嘗試執行

CREATE INDEX user_username_idx ON user(username); 

,然後創建你的外鍵應該工作。

+0

我已經試過這個,但它不起作用,沒有人通過添加索引和引用外鍵來嘗試嗎? – Rajesh