2012-02-08 63 views
6

我建立这样的两个表(这只是一个简单的和非专有的例子):添加一个可为空的外键。

Person Table 
----------- 
p_Id, f_name, l_name 

Job Table 
---------- 
job_Id, job_desc 

我想添加一个外键列,Persons.job_Id,可以可空引用工作。 job_Id(PK)原因是,该作业可能不会提前知道,因此可能为空。拥有“其他”不是一种选择。

我到目前为止,但我得到“无法创建约束”。

ALTER TABLE dbo.Person 
ADD job_Id INT FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id) 

在此先感谢。

+0

执行2列匹配的数据类型? – 2012-02-08 19:12:24

+0

他们需要.Job_Id是连续整数的标识列。 – Yatrix 2012-02-08 19:15:57

+0

任何人都在意为什么他们downvoted所以我可以改变这个问题,使其更好和/或从我的错误中学习? – Yatrix 2012-02-08 19:27:03

回答

12

尝试在两个步骤:

ALTER TABLE dbo.Person ADD job_Id INT NULL; 
ALTER TABLE dbo.Person ADD CONSTRAINT FL_JOB 
FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id); 
+6

'ALTER TABLE dbo.Person ADD job_Id INT NULL,CONSTRAINT FL_JOB FOREIGN KEY(job_Id)REFERENCES dbo.Job(job_Id);'也可以在一个语句中执行。 – 2012-02-08 19:18:18

+1

@马丁史密斯:对,我在这些事情上有点老派,他们真的很喜欢一次做一个,但他也很好。 – Mithrandir 2012-02-08 19:21:37

+0

所以,我最初创建了Job表,然后不得不重新创建它。当我重新创建它时,我忘了创建主键...该死的。感谢所有人的帮助。 – Yatrix 2012-02-08 19:48:26

8

试试这个样子,WITH NOCHECK:

ALTER TABLE dbo.Person ADD job_Id INT NULL; 
ALTER TABLE dbo.Person WITH NOCHECK ADD CONSTRAINT FL_JOB 
FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id); 
+0

WITH NOCHECK帮助当外键可能是NULL – 2016-01-28 13:30:37

+0

看着这个[答](http://stackoverflow.com/a/1338565/755977),似乎可能会有性能的副作用。这是强制性的吗? – PhilDulac 2016-11-16 17:30:14