现有 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。
我知道以上内容没有任何意义;我只是试图将其保持在一次一个步骤中,因为应用程序取决于架构,此时我不想引入任何新错误。
为了进一步说明,这里是 users
和 students
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
字段中拥有 id
和 termInitiated
的独特组合。
您可以将它用作主键,如果您想 select 它或将它与其他 table 连接,您可以通过两个字段的组合来引用它。
例如,
如果你想加入student
table和users
,你可以这样加入:
SELECT * FROM users
INNER JOIN students
ON CONCAT(users.studentId, '-', termInitiated) = student.pid);
我希望这对你有用。
请correct/suggest我,我错了
谢谢。
我正在使用 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。
我知道以上内容没有任何意义;我只是试图将其保持在一次一个步骤中,因为应用程序取决于架构,此时我不想引入任何新错误。
为了进一步说明,这里是 users
和 students
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
字段中拥有 id
和 termInitiated
的独特组合。
您可以将它用作主键,如果您想 select 它或将它与其他 table 连接,您可以通过两个字段的组合来引用它。
例如,
如果你想加入student
table和users
,你可以这样加入:
SELECT * FROM users
INNER JOIN students
ON CONCAT(users.studentId, '-', termInitiated) = student.pid);
我希望这对你有用。 请correct/suggest我,我错了
谢谢。