添加可以为空的外键。

时间:2012-02-08 19:09:11

标签: sql sql-server-2008 foreign-keys

我有两个这样构建的表(这只是一个简化的非专有示例):

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

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

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

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

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

提前致谢。

3 个答案:

答案 0 :(得分:13)

分两步尝试:

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);

答案 1 :(得分:11)

尝试这样,没有检查:

if err != nil {
    return err
}
defer rows.Close()
if rows.Next() {
    ...
}

答案 2 :(得分:-1)

下面是我以编程方式创建外键的解决方案。
TestTable1可以替代FK,该FK可以为NULL或与TestTable2中的记录匹配。
TestTable2在TestTable1中具有标准FK。

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