Ограничение на включение таблицы для части записей - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть база данных и есть две таблицы «Сотрудники» и «Карты».В таблице Employees есть первичный ключ EmplID, который является внешним ключом в таблице Cards.Новая функция требует добавления записей (временных карточек) в таблицу карточек с поддельным (случайным образом сгенерированным) EmplID, которого нет в таблице сотрудников.Мне нужна некоторая замена для внешнего ключа в таблице Cards, которая будет работать для части записей в таблице.

1 Ответ

0 голосов
/ 16 сентября 2018

Я абсолютно согласен с 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
...