2012-02-08 1 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 колонок? –

+0

Им нужно to.Job_Id - столбец Identity последовательных ints. – Yatrix

+0

Кто-нибудь хочет сказать, почему они ниспровергнуты, поэтому я могу либо изменить вопрос, чтобы сделать его лучше и/или узнать из моей ошибки? – Yatrix

ответ

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) ССЫЛКИ dbo.Job (job_Id);' работает тоже, чтобы сделать это в одном выражении. –

+1

@MartinSmith: Право, я немного старая школа в этих вещах и очень люблю делать их по одному, но его очень хорошо это сделать. – Mithrandir

+0

Итак, я создал таблицу Job, и мне пришлось ее воссоздать. Когда я воссоздал его, я забыл создать первичный ключ ... черт возьми. Спасибо за помощь, все. – Yatrix

8

Попробуйте так, с 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

С NOCHECK помогает, когда внешний ключ может быть NULL –

+0

Глядя на этот [ответ] (http://stackoverflow.com/a/1338565/755977), кажется, что могут быть побочные эффекты производительности. Это обязательно? – PhilDulac