MySQL - 无法向表中添加外键

时间:2011-09-25 15:36:15

标签: sql foreign-keys

我有一个使用MySQL 2005的数据库。我有两个表,Enrollment和AlertMsg。

注册的主键是两列,UnitCode和StudentID。这两列都是另一个表的外键。

AlertMsg的主键是三列,UnitCode,StudentID和AlertNo。

当我尝试在AlertMsg表中使用UnitCode创建外键时,如下所示:

ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment(UnitCode)

我收到以下错误:

SQL Execution Error.

Executed SQL statement: ALTER TABLE AlertMsg

ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment (UnitCode)
Error Source: .Net SqlClient Data Provider
Error Message: There are no primary or candidate keys in the referenced table 'Enrolment' that match the referencing column list in the foreign key 'FK_AlertMsg_UnitCo_571DF1D5'.
Could not create constraint. See previous errors.

经过一些搜索后,似乎这是因为UnitCode不是Enrollment的主键。但是Enrollment的表定义似乎表明它是。我在SQL上有点新手,所以我假设如果表定义的最左列有一个键,则表示它是表的主键。

有人可以帮忙吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

  

注册的主键是两列,UnitCode和   学生卡。这两列都是另一个表的外键。

     

AlertMsg的主键是三列,UnitCode,StudentID   和AlertNo。

你说“......的主键”。实际上它可能不是多个键,而是使用多个列创建的一个键。这些列是表中需要唯一的,因此您不能只引用外键中的一列。

如果您希望此声明有效

ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment(UnitCode)

UnitCodeEnrolment中的值必须是唯一的,您需要在该列上添加唯一约束。我想情况并非如此,因此您无法添加必要的唯一约束。

您应该使用此代码:

ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode, StudentID)
REFERENCES Enrolment(UnitCode, StudentID)

答案 1 :(得分:0)

标准主键不必是表中最左侧的索引列,只是开发人员和定义表的DBA将主键列放在首位的常见习惯。

在标准SQL中,外键必须引用:

  • 在引用的表格中定义为PRIMARY KEYUNIQUE KEY的列。
  • 外键中的列不必具有相同的名称,但它们的数量,顺序和数据类型必须相同。

我怀疑你真的使用的是Microsoft SQL Server 2005,而不是MySQL。没有这样的产品发布称为“MySQL 2005”。

答案 2 :(得分:0)

您可以尝试:

  • 将外键约束添加到Enrollment表的2列(UnitCode,StudentID)。 或者
  • 如果您只需要对UnitCode列的引用,则将唯一约束添加到Enrollment表的列(UnitCode)。

H个。