我有一个数据库,有两个表Employees和Cards。 Employees表中有一个主键EmplID,它是Cards表中的外键。新功能需要将记录(临时卡)添加到带有伪随机生成的EmplID的Cards表中,这在Employees表中是不存在的。我需要替换Cards表中的外键,这将适用于表中的部分记录。
我绝对同意SMor这样做可能是一个非常糟糕的主意。您应该重新考虑您的要求以及您要完成的任务。
最简单的解决方案是使用伪ID向Employee表添加记录,以便维护约束。
话虽这么说,有可能吗?是的,......有点......有点儿。
首先,您需要能够区分不需要约束的虚假记录和真正的记录。在我的例子中,我添加了一个布尔标志IsFake
,但你的标准可能不同。
然后创建一个计算列,如果它是真实记录则保存EmpID
,如果是假的则创建NULL
,并设置针对该列的外键约束。请注意,为了在计算列上强制使用外键约束,必须将其保留。
create table Emp ( EmpID int not null primary key identity(1,1),
EmpName nvarchar(60) )
create table Crd ( CrdID int not null primary key identity(1,1),
IsFake bit not null,
MaybeEmpID int,
CrdVal nvarchar(60),
EmpID as
case when IsFake=1 then NULL else MaybeEMPID end
persisted
foreign key references Emp(EmpID)
)
-- Create some real records
declare @ID int
insert into Emp ( EmpName ) values ( 'Fred' )
set @ID = scope_identity()
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 0, @ID, 'King' )
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 0, @ID, 'Jack' )
insert into Emp ( EmpName ) values ( 'Mary' )
set @ID = scope_identity()
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 0, @ID, 'Queen' )
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 0, @ID, 'Ace' )
-- Create some fake records
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 1, 9876789, 'Five' )
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 1, 9876789, 'Three' )
insert into Crd ( IsFake, MaybeEmpID, CrdVal ) values ( 1, 7474747, 'Seven' )
select * from Emp
select * from Crd
select * from Emp,Crd where Emp.EmpID = Crd.EmpID