Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 添加可为空的外键_Sql_Sql Server 2008_Foreign Keys - Fatal编程技术网

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