2012-02-08 75 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