我有两个这样构建的表(这只是一个简化的非专有示例):
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)
提前致谢。
答案 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