【问题标题】:Adding a nullable foreign key添加可以为空的外键
【发布时间】:2012-02-08 19:09:10
【问题描述】:

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

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)

【问题讨论】:

  • 2列的数据类型是否匹配?
  • 他们需要。Job_Id 是顺序整数的标识列。
  • 有人愿意说出他们投反对票的原因,以便我可以更改问题以使其变得更好和/或从我的错误中吸取教训?

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


【解决方案1】:

分两步试试:

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

【讨论】:

  • ALTER TABLE dbo.Person ADD job_Id INT NULL,CONSTRAINT FL_JOB FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id); 也可以在一个声明中做到这一点。
  • @MartinSmith :对,我在这些事情上有点老派,真的很喜欢一次做一件,但他也很擅长这样做。
  • 所以,我最初创建了 Job 表,然后不得不重新创建它。当我重新创建它时,我忘了创建主键......该死。谢谢大家的帮助。
【解决方案2】:

试试这样,用 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);

【讨论】:

  • WITH NOCHECK 在外键可能为 NULL 时有帮助
  • 看这个answer,好像有性能副作用。这是强制性的吗?
  • 这是个好主意吗?我读到它允许不在引用表中的值。
  • 我认为它只允许 NULL,不允许其他值,不在引用表中..
【解决方案3】:

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

创建表TestTable1(ID1 int IDENTITY UNIQUE,ID2 int NULL); 去 CREATE Table TestTable2 (ID2 int IDENTITY UNIQUE, ID1 int NOT NULL 外键引用TestTable1(ID1)); 去 CREATE 过程 CreateTestRecord1 @ID2 int null AS 开始 如果@iD2 不为空且不存在(SELECT * from TestTable2 where ID2 = @ID2) 开始 RAISERROR('无法插入TestTable1记录。ID为%d的TestTable2记录不存在', 16, 1, @ID2); 返回; 结尾 插入到 TestTable1(ID2) OUTPUT Inserted.ID1 Values(@ID2); 结尾 去 CREATE 过程 LinkTable1toTable2 @ID1 int, @ID2 int NULL as 开始 如果@iD2 不为空且不存在(SELECT * from TestTable2 where ID2 = @ID2) 开始 RAISERROR('无法更新TestTable1记录中的ID2。ID为%d的TestTable2记录不存在', 16, 1, @ID2); 返回; 结尾 更新 TestTable1 设置 ID2=@ID2 其中 ID1=@ID1; 选择@@ROWCOUNT; 结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2012-12-10
    • 2014-07-17
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多