Sql 添加可为空的外键
我有两个这样构建的表这只是一个简化的非专有示例:Sql 添加可为空的外键,sql,sql-server-2008,foreign-keys,Sql,Sql Server 2008,Foreign Keys,我有两个这样构建的表这只是一个简化的非专有示例: Person Table ----------- p_Id, f_name, l_name Job Table ---------- job_Id, job_desc 我想添加一个外键列Persons.job_Id,它可以为null,引用job.job_Id主键原因是,作业可能事先不知道,因此它可以为null。拥有另一半不是一种选择 到目前为止,我已经做到了这一点,但我无法创建约束 ALTER TABLE dbo.Person ADD j
Person Table
-----------
p_Id, f_name, l_name
Job Table
----------
job_Id, job_desc
我想添加一个外键列Persons.job_Id,它可以为null,引用job.job_Id主键原因是,作业可能事先不知道,因此它可以为null。拥有另一半不是一种选择
到目前为止,我已经做到了这一点,但我无法创建约束
ALTER TABLE dbo.Person
ADD job_Id INT FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id)
分两步尝试:
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;
ALTER TABLE dbo.Person WITH NOCHECK ADD CONSTRAINT FL_JOB
FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id);
下面是我通过编程创建外键的解决方案。 TestTable1的FK替换为NULL或与TestTable2中的记录匹配。 TestTable2在TestTable1中具有标准FK
这两列的数据类型匹配吗?它们需要匹配。Job_Id是连续整数的标识列。有人想说为什么他们否决了投票,这样我就可以改变问题使其更好和/或从错误中吸取教训吗?更改表dbo。Person ADD Job_Id INT NULL,CONSTRAINT FL_Job外键Job_Id引用dbo.Jobjob_Id;马丁·史密斯:是的,我在这些事情上有点老派,真的很喜欢一次做一件,但他也很擅长这样做。所以,我最初创建了工作表,然后不得不重新创建它。当我重新创建它时,我忘了创建主键…该死。感谢您的帮助,all.WITH NOCHECK帮助当外键可能为空时看看这个,似乎可能会有性能方面的副作用。这是强制性的吗?这是个好主意吗?我读到它允许引用表中没有的值。我认为它只允许NULL,不允许引用表中没有的其他值。。 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