对表的约束启用部分记录

问题描述 投票:0回答:1

我有一个数据库,有两个表Employees和Cards。 Employees表中有一个主键EmplID,它是Cards表中的外键。新功能需要将记录(临时卡)添加到带有伪随机生成的EmplID的Cards表中,这在Employees表中是不存在的。我需要替换Cards表中的外键,这将适用于表中的部分记录。

sql sql-server database foreign-keys constraints
1个回答
1
投票

我绝对同意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
© www.soinside.com 2019 - 2024. All rights reserved.