MySQL在现有表上的复合主键

时间:2015-02-06 05:29:51

标签: mysql database mysql-workbench composite-primary-key

我正在使用MySQL工作台来管理我的一个数据库,该数据库是为了开发任务而传递给我的。不幸的是,架构是一场噩梦:没有多个表的主键,大量列重复等等。

首先,我想添加一些独特性,以便我可以以某种方式开始标准化。我有一个“学生”表,其中一名学生(带有ID)参与属于特定术语的项目(2014年秋季,2015年春季等)

由于同一个学生无论出于何种原因可以连续两个学期在同一个项目上工作,只有这样才能告诉他们与他们分开(学生ID,学期)PK。所以我确实需要复合PK。

如何更改现有表并设置复合PK?


修改

澄清:架构包含一个users表,其中包含实际的学生信息(名/姓,电子邮件,期限)。 students表更适合命名为projects,因为它只通过ID引用学生,然后在他们处理的学期中列出他们所处理的项目。至少,students.id也是来自users的FK。

我知道上面的内容没有任何意义;我只是想一次保持这一步,因为应用程序依赖于架构,我不想在此时引入任何新的错误。


为了进一步澄清,以下是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将是最好的解决方案。

2 个答案:

答案 0 :(得分:2)

如果未添加复合键,您可能需要为自己授予更改权限,请查看此处:https://kb.mediatemple.net/questions/788/How+do+I+grant+privileges+in+MySQL%3F#dv 这是adrian的链接:ALTER TABLE to add a composite primary key

答案 1 :(得分:0)

我的建议是,在表格中为主键添加一个新字段,其中包含两个字段的唯一组合。 例如,在您的情况下,在pid表中添加一个字段students

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

然后更新此表:

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

因此,您会在id字段中拥有termInitiatedpid的唯一组合。 您可以将其用作主键,如果要选择它或将其与其他表连接,可以使用两个字段的组合来引用它。 例如, 如果您想将student表加入users,则可以加入:{/ p>

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

我希望这对你有用。 请纠正/建议我,我错了。

谢谢。