2015-10-18 39 views
1

假設我有下面的表:外鍵 - ID或者只是UNIQUE列

CREATE TABLE users 
{ 
    id INTEGER PRIMARY KEY, 
    login VARCHAR(50) UNIQUE, 
    password VARCHAR(50) 
} 

,我需要創建一個將存儲每個帳戶一個cookie的表。更棒的是 - 創建一個指login列從第一個表

CREATE TABLE cookies 
{ 
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    login VARCHAR(50) FOREIGN KEY REFERENCES users(login) 
} 

或創建指id列外鍵的外鍵?

CREATE TABLE cookies 
{ 
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    expires DATETIME, 
    id_user INTEGER FOREIGN KEY REFERENCES users(id) 
} 

爲什麼?

+0

我更願意匹配用戶(id)的FK,這是最好的方式。 – Chandru

+1

Cookie列的用途是什麼?它是cookie表中的一列或幾列?它是每個用戶的cookie表中的一行嗎?或者可能有幾個?如果您直接在用戶表中添加該列,該怎麼辦? –

+0

如果內存服務,至少在sql server中,至少在外鍵約束的一側使用主鍵(一對一兩邊都應該是主鍵) –

回答

3

好的,因爲你在cookie表中有幾列,並且由於這是一個獨立的實體,我同意,並且在獨立表中採用這些附加列是有意義的。那麼pks和fks呢?既然你每個用戶只有一個行我會做一個useridprimary key同時foreign key

cookies 
{ 
    id_user(pk, fk), 
    cookie, 
    expires 
} 
+0

感謝您的回答!我怎麼能添加一個關於特定用戶的行到這個表呢? – FrozenHeart

+0

首先你向用戶表中添加行,然後共同合作表。將行添加到表有什麼問題有點不清楚? –

+0

可以嗎 - http://sqlfiddle.com/#!9/91cdce? – FrozenHeart

1
CREATE TABLE cookies 
{ 
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    login VARCHAR(50) FOREIGN KEY REFERENCES users(login) 
} 

我覺得這是更好的選擇,因爲你需要與login溝通。

+0

請注意,在MySQL中,這行:'login VARCHAR(50)FOREIGN KEY REFERENCES users(login)'將不會創建一個FOREIGN KEY **。專欄將在那裏,但FK的定義將會悲傷而寧靜地被忽略。 –

1

使用,涉及到用戶表的主鍵的外鍵:

create a foreign key that refers to the id column? 

CREATE TABLE cookies 
(
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    expires DATETIME, 
    user_id INTEGER, 
    FOREIGN KEY (user_id) REFERENCES users(id) 
) 

之所以這樣做這是一個一般的慣例是,用戶(ID)主鍵是一個不可變的值。 「登錄」列或其他表示關於數據庫外部對象的元數據的數據可能隨時間而改變,因此不太適合在外鍵引用中使用。

+0

請注意,在MySQL中,這一行:'id_user INTEGER FOREIGN KEY REFERENCES用戶(id)'將**不會創建一個FOREIGN KEY **。專欄將在那裏,但FK的定義將會悲傷而寧靜地被忽略。 –

+0

不,內聯外鍵定義在所有引擎中都被忽略。您需要分別定義外鍵。請參閱:** [使用外鍵和引用在mysql中的ON DELETE CASCADE](http://dba.stackexchange.com/questions/14070/using-foreign-key-and-references-for-on-delete-cascade- in-mysql/14086#14086)** –

+0

很好看,我刪除了我的評論。您可以澄清您的評論,以顯示如何正確執行外鍵,因爲這有助於更好地回答問題。 –