2012-02-08 55 views
0

對某些人來說,這可能是一個非常簡單的問題,但我覺得很難理解。這是一個什麼樣的關鍵?

該場景: 我正在使用學校數據庫。 我有一個表將類與一個名爲'subject_class'的主題聯繫起來。

一個類可以是多個主題的一部分,而主題可以包含多個類。所以從我的理解來看,這是一個表格中的多對多關係。

的數據庫將如何看一個例子:

subject_id   class_id 
    1     14 
    1     15 
    2     14 
    *1    *14 

正如你所看到的,相同的數據可以被輸入到表中不止一次(帶星號如上圖所示)。我希望這個停止發生。我的問題是,這將是什麼樣的關鍵?爲什麼?或者我怎麼能阻止這個問題的發生?

我希望這是有道理的,請讓我知道如果沒有,我會提供更多信息。

在此先感謝。

+0

這是什麼類型的數據庫? MySQL的? – 2012-02-08 00:21:16

回答

3

你會想在subject_id和class_id上有一個唯一的密鑰來防止重複。但是您需要確保您的應用程序能夠:處理在嘗試插入已存在的值組合時嘗試阻止其提交重複項的錯誤。或者,如果您希望後續插入覆蓋現有條目,則應查看數據庫軟件是否可以處理ON DUPLICATE KEY UPDATE。

0

幾乎所有你需要的是一個UNIQUE適用於兩列。一般流程如下:應用程序嘗試保存關係而不在動作之前進行驗證並等待數據庫應答。在重複的情況下,插入返回一個錯誤,應該在應用程序中進一步處理。

+0

他希望這樣做,以便每列可以有多個條目,只要兩列的兩行都不相同即可。所以(1,2)(1,3)(2,4)的(subject,class)是可以的,但是有(1,2)兩次不是。 – Tim 2012-02-08 00:22:09

+0

@Tim,這就是爲什麼有* one *唯一鍵應用於兩列。 – 2012-02-08 00:23:02

+0

對不起,誤讀。認爲你的意思是每個專欄應該是獨一無二的。 – Tim 2012-02-08 00:23:51

-1

在兩個字段中添加一個UNIQUE。

ALTER TABLE `table` ADD UNIQUE ( `subject_id` , `class_id`) ; 
+0

這不會改變任何唯一性! – 2012-02-08 00:22:34

0

你想要一個獨特的密鑰,跨越兩行:這樣兩列每個可以有非唯一數據,而不是在組合

ALTER TABLE subject_class ADD UNIQUE INDEX sanity (subject_id, class_id); 
0

更好,如果你確認它在您正在使用的應用程序編程語言。在更新插入數據庫之前應用檢查。

在數據庫級別,您可以使用組合唯一鍵。唯一標識一行。

alter table subject_class ADD UNIQUE INDEX sanity (subject_id, class_id); 
+0

那也不處理同步請求,至少不是那麼容易。 – 2012-02-08 00:23:37

+0

查看更新的答案。 – 2012-02-08 00:29:14

0

創建橫跨兩個領域

ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id) 

一個主鍵,但你將需要刪除重複項,然後才能添加索引。