SQL 添加外键到现有列
在这个问题中,出现的原因是在SQL语句中添加外键时,可能会出现列名混淆的情况。解决方法是确保正确指定需要添加外键的表和列名。
可能是列名搞错了:
ALTER TABLE Employees ADD FOREIGN KEY (UserID) <-- 这需要是Employees表中的一个列名 REFERENCES ActiveDirectories(id) <-- 这需要是ActiveDirectories表中的一个列名
可能是Employees表中的列名叫做ID,而ActiveDirectories表中的列名叫做UserID:
ALTER TABLE Employees ADD FOREIGN KEY (ID) <-- Employees表中的列名 REFERENCES ActiveDirectories(UserID) <-- ActiveDirectories表中的列名
我知道这很奇怪,但不幸的是在ActiveDirectory表中的列名是id。
在这个问题中,出现错误是因为在Employees表中没有UserID列。解决方法是先添加列,然后重新运行语句。
ALTER TABLE Employees ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID) REFERENCES ActiveDirectories(id);
这是正确的。我们的数据库没有更新添加的列。这个问题已经解决,但是我们的列已经建立,我仍然不能添加约束。错误信息显示“在引用的表'ActiveDirectories'中,没有与外键“FK__Employees__UserI__04E4BC85”中的引用列列表匹配的主键或候选键。”
看起来,由FK__Employees__UserI__04E4BC85引用的列在ActiveDirectories表中没有定义为主键或候选键。
是的,但它绝对是ActiveDirectories表中的主键。
解决方法:在构建之前创建ERD并建立关系是有原因的。我们的一张表中有太多记录,这导致在创建与另一张表的关系时出错。谢谢大家。
参考链接:stackoverflow.com/questions/35196951/…
谢谢,这个方法有效。给未来的读者一个注意:请确保两个表的外键值匹配,否则会出现此警告。
您可以添加ON DELETE CASCADE ON UPDATE CASCADE
。
在MySQL / SQL Server / Oracle / MS Access数据库中,如果要向现有列添加外键,可以使用以下SQL语法:
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)
以上是添加外键的常用语法。