Добавление обнуляемого внешнего ключа. - PullRequest
9 голосов
/ 08 февраля 2012

У меня есть две таблицы, построенные следующим образом (это просто упрощенный и непатентованный пример):

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

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

Я хочу добавить столбец внешнего ключа Persons.job_Id, который может быть обнуляем, чтоссылки Job.job_Id (PK). Причина в том, что задание может быть неизвестно заранее, поэтому оно может быть нулевым.Иметь «Другое» не вариант.

У меня было это до сих пор, но я получаю "не могу создать ограничение".

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

Заранее спасибо.

Ответы [ 3 ]

14 голосов
/ 08 февраля 2012

Попробуйте в два этапа:

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);
11 голосов
/ 09 сентября 2015

Попробуй так, С НОЧЕТОМ:

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 голосов
/ 20 марта 2019

Ниже представлено мое решение с программным созданием внешнего ключа.
TestTable1 имеет замену FK, которая является либо NULL, либо соответствует записи в TestTable2.
TestTable2 имеет стандартный FK в TestTable1.

CREATE Table TestTable1 (ID1 int IDENTITY UNIQUE, ID2 int NULL);
GO
CREATE Table TestTable2 (ID2 int IDENTITY UNIQUE, ID1 int NOT NULL foreign key references TestTable1(ID1));
GO
CREATE procedure CreateTestRecord1 @ID2 int null AS
begin
    if @iD2 IS NOT NULL AND NOT EXISTS(SELECT * from TestTable2 where ID2 = @ID2)
    begin
        RAISERROR('Cannot insert TestTable1 record. TestTable2 record with ID %d doesnt exist', 16, 1, @ID2);
        return;
    end
    Insert into TestTable1(ID2) OUTPUT Inserted.ID1 Values(@ID2);
end
GO
CREATE procedure LinkTable1toTable2 @ID1 int, @ID2 int NULL as
begin
    if @iD2 IS NOT NULL AND NOT EXISTS(SELECT * from TestTable2 where ID2 = @ID2)
    begin
        RAISERROR('Cannot update ID2 in TestTable1 record. TestTable2 record with ID %d doesnt exist', 16, 1, @ID2);
        return;
    end
    update TestTable1 Set ID2=@ID2 where ID1=@ID1;
    select @@ROWCOUNT;
endGO
...