向现有列添加外键的SQL语句

125

如果我在SQL Server 2008中使用以下SQL命令更新一个带有外键约束的表:

ALTER TABLE Employees
ADD FOREIGN KEY (UserID)
REFERENCES ActiveDirectories(id)

UserID 是我在 Employees 表中的外键列。 我试图引用 ActiveDirectories 表中的 UserID 。我收到以下错误:

外键 'UserID' 引用了参考表 'Employees' 中的无效列 'UserID'。


1
您能提供您的两个表的架构吗? - Stefan H
请参考此链接:http://stackoverflow.com/questions/35196951/how-can-id-assign-foreign-key-mysqli/35197004#35197004 - Jigar
7个回答

218

出错了,这意味着你的员工表中没有 UserID 列。尝试先添加该列,然后重新运行该语句。

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);

这是正确的。我们的数据库没有更新我们的添加列。这个问题已经解决了,但是现在我们的列已经建立,我仍然无法添加约束条件。"在外键'FK__Employees__UserI__04E4BC85'中,引用列列表中没有与引用表'ActiveDirectories'中的主键或候选键匹配的项。" - ExceptionLimeCat
看起来在ActiveDirectories表中,FK__Employees__UserI__04E4BC85所引用的列没有被定义为PRIMARY KEY或候选键。 - BluesRockAddict
是的,但它绝对是我们在ActiveDirectories表中的PK。 - ExceptionLimeCat
1
已解决:在构建之前创建ERD并建立关系是有原因的。我们在一个表中有太多记录,导致尝试创建到其他表的关系时出现错误。谢谢大家。 - ExceptionLimeCat
请参考此链接:http://stackoverflow.com/questions/35196951/how-can-id-assign-foreign-key-mysqli/35197004#35197004 - Jigar
显示剩余2条评论

24

也许你把列搞反了?

ALTER TABLE Employees
ADD FOREIGN KEY (UserID)           <-- this needs to be a column of the Employees table
REFERENCES ActiveDirectories(id)   <-- this needs to be a column of the ActiveDirectories table

这个列在Employees表中叫做ID,在ActiveDirectories表中叫做UserID,这可能是原因吗?

那么你的命令应该是:

ALTER TABLE Employees
ADD FOREIGN KEY (ID)                   <-- column in table "Employees"
REFERENCES ActiveDirectories(UserID)   <-- column in table "ActiveDirectories" 

1
我知道这很奇怪,但不幸的是ActiveDirectory表中的名称ID - ExceptionLimeCat

5

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

为了允许给外键约束命名并在多列上定义外键约束,请使用以下SQL语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

3
未来的时候。
ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);

1
ALTER TABLE Faculty 
WITH CHECK ADD  CONSTRAINT FKFacultyBook
FOREIGN KEY FacId
REFERENCES Book Book_Id

ALTER TABLE Faculty 
WITH CHECK ADD  CONSTRAINT FKFacultyStudent 
FOREIGN KEY FacId
REFERENCES Student StuId

6
好的,我会尽力进行翻译。请提供需要翻译的内容。 - fen1x

0

外键创建的方式针对ActiveDirectories(id)是正确的,我认为主要错误在于您没有在ActiveDirectories表中提及id的主键。


0
如果表已经被创建:
首先执行:
ALTER TABLE `table1_name` ADD UNIQUE( `column_name`);

然后:

ALTER TABLE `table1_name` ADD FOREIGN KEY (`column_name`) REFERENCES `table2_name`(`column_name`);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接