2015-02-06 53 views
0

我正在使用MySQL工作臺來管理我的數據庫,這個數據庫已交給我進行開發任務。不幸的是,模式是一場噩夢:無數表的主鍵,大量的列重複等。現有表上的MySQL中的複合主鍵

首先,我想添加一些獨特性,以便我可以以某種方式開始標準化。我有一個'學生'表,一個學生(帶身份證)在一個屬於特定學期的項目上工作(2014年秋季,2015年春季等)

由於同一個學生可以在同一個項目上工作,無論出於何種原因連續學期,只有將他們分開的方法是獲得(學生證,學期)PK。所以我確實需要這個複合PK。

我該如何改變現有的表格並設置複合PK?


編輯

爲了澄清:該架構包含users表與實際的學生信息(/姓,電子郵件,期限)。 students表格更適合地命名爲projects,因爲它僅通過ID引用學生,然後列出他們在其工作的學期中所從事的項目。所以至少,students.id也將從users FKK。

我知道上面沒有任何意義;我只是試圖保持這一步一次,因爲應用程序依賴於模式,我不想在這一點上引入任何新的錯誤。


爲了進一步澄清,這裏是usersstudents表什麼樣子:

students

id  project  termInitiated  ... 
20  XYZ   Summer 2013 
20  XYZ   Fall 2013 
23  ABC   Fall 2013 
24  ABC   Fall 2014 
... 

users

studentId  firstName  lastName  termInitiated 
20    A    AA    Summer 2013 
20    A    AA    Fall 2013 
23    Z    ZZ    Fall 2013 
24    Y    YY    Fall 2014 
... 

不幸的是,由於它的方式設置,我不能有studentId本身就是一個PK,因爲同一個學生可能連續多個學期在同一個項目上工作。

最好的解決這將是一個全局唯一標識符,可以是指在不同的方面是相同的學生,但這個權利,現在,我沒有固定的時間將引入錯誤的巨大量。因此,我認爲考慮到我的侷限性,複合PK將是最好的解決方案。

+0

您的方法沒有意義。如果您的'student'表包含* foreign *數據,則將其分成單獨的表格。 – 2015-02-06 05:35:02

+0

請參閱我的編輯,因爲它作爲評論是相當長的。 – user991710 2015-02-06 05:41:05

+0

你可能想檢查這裏的阿德里安的答案: http://stackoverflow.com/questions/8859353/alter-table-to-add-a-composite-primary-key – 2015-02-06 05:47:06

回答

0

我的建議是,在添加一個新的領域你主鍵的表與兩個字段的唯一組合。 例如,在你的情況下,加假設pid字段中students表:

ALTER TABLE students 
ADD pid VARCHAR(100) UNIQUE PRIMARY KEY; 

,然後更新該表:

UPDATE students SET pid=CONCAT(id, '-', termInitiated); 

所以,你將有pid領域idtermInitiated獨特組合。 你可以使用它作爲主鍵,如果你想選擇它或與其他表加入它,你可以引用它與兩個字段的組合。 例如, 如果你想加入studentusers,你可以加入這樣的:

SELECT * FROM users 
INNER JOIN students 
ON CONCAT(users.studentId, '-', termInitiated) = student.pid); 

我希望這會爲你工作。 請更正/建議我,我錯了。

謝謝。