我有一个使用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上有点新手,所以我假设如果表定义的最左列有一个键,则表示它是表的主键。
有人可以帮忙吗?提前谢谢。
答案 0 :(得分:1)
注册的主键是两列,UnitCode和 学生卡。这两列都是另一个表的外键。
AlertMsg的主键是三列,UnitCode,StudentID 和AlertNo。
你说“......的主键”。实际上它可能不是多个键,而是使用多个列创建的一个键。这些列是表中需要唯一的,因此您不能只引用外键中的一列。
如果您希望此声明有效
ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment(UnitCode)
表UnitCode
中Enrolment
中的值必须是唯一的,您需要在该列上添加唯一约束。我想情况并非如此,因此您无法添加必要的唯一约束。
您应该使用此代码:
ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode, StudentID)
REFERENCES Enrolment(UnitCode, StudentID)
答案 1 :(得分:0)
标准主键不必是表中最左侧的索引列,只是开发人员和定义表的DBA将主键列放在首位的常见习惯。
在标准SQL中,外键必须引用:
PRIMARY KEY
或UNIQUE KEY
的列。我怀疑你真的使用的是Microsoft SQL Server 2005,而不是MySQL。没有这样的产品发布称为“MySQL 2005”。
答案 2 :(得分:0)
您可以尝试:
H个。