Я абсолютно согласен с SMor, что делать это, вероятно, очень плохая идея. Вам следует пересмотреть свои требования и то, что вы пытаетесь выполнить.
Самое простое решение - просто добавить в таблицу Employee запись с поддельным идентификатором, чтобы сохранить ограничение.
Как говорится, возможно ли это? Да, ... вроде как ... вроде ...
Во-первых, вы должны уметь различать фальшивые записи, которые не нуждаются в ограничении, и реальные, которые требуют. В моем примере я добавил логический флаг IsFake
, но ваш критерий может быть другим.
Затем создайте вычисляемый столбец, который содержит EmpID
, если это реальная запись, и NULL
, если это фальшивка, и установите ограничение внешнего ключа для этого столбца. Обратите внимание, чтобы навязать ограничение внешнего ключа для вычисляемого столбца, оно должно быть persisted .
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