现有 table 上 MySQL 中的复合主键

Composite primary key in MySQL on existing table

我正在使用 MySQL workbench 来管理我的数据库,该数据库是为完成开发任务而交给我的。不幸的是,该模式是一场噩梦:许多 table 没有主键,大量列重复等

首先,我想添加一些独特性,以便我可以以某种方式开始规范化。我有一个 'students' table,其中一名学生(带有 ID)从事属于特定学期的项目(2014 年秋季、2015 年 Spring 等)

由于无论出于何种原因,同一个学生可以连续两个学期从事同一个项目,区分他们的唯一方法就是拥有一个(学生 ID,学期)PK。所以我确实需要复合PK。

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


编辑:

澄清一下:架构包含 users table 和实际学生信息(First/Last 姓名、电子邮件、学期)。 students table 更恰当地命名为 projects,因为它仅按 ID 引用学生,然后列出他们在该学期从事的项目。所以至少,students.id 也是来自 users 的 FK。

我知道以上内容没有任何意义;我只是试图将其保持在一次一个步骤中,因为应用程序取决于架构,此时我不想引入任何新错误。


为了进一步说明,这里是 usersstudents table 的样子:

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 将是最好的解决方案。

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

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

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

然后更新此 table:

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

因此您将在 pid 字段中拥有 idtermInitiated 的独特组合。 您可以将它用作主键,如果您想 select 它或将它与其他 table 连接,您可以通过两个字段的组合来引用它。 例如, 如果你想加入student table和users,你可以这样加入:

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

我希望这对你有用。 请correct/suggest我,我错了

谢谢。