Может ли уникальный индекс WHERE, который позволяет использовать несколько NULL, в качестве первичного ключа для отношения внешнего ключа?
Нет. На уникальные отфильтрованные индексы нельзя ссылаться по внешним ключам. Внешние ключи могут ссылаться на уникальные индексы (даже с включенными столбцами, но без фильтров).
edit: для Nullability. Внешние ключи могут ссылаться на уникальные индексы / ограничения с NULLable столбцами. Обнуляемость не является обязательным условием для создания внешних ключей. Однако внешние ключи НЕ проверяются на наличие строк с хотя бы одним нулевым значением в любом из столбцов fk:
create table dbo.parent
(
id1 int null,
id2 int null,
constraint id1id2 unique(id1, id2)
);
insert into dbo.parent(id1, id2)
values(1, 1), (2, 2), (3, null);
go
create table dbo.child
(
childid int identity,
parentid1 int,
parentid2 int,
constraint fkparent foreign key(parentid1, parentid2) references parent(id1, id2)
)
go
insert into dbo.child(parentid1, parentid2)
values (1, 1), (2, 2) --ok
go
insert into dbo.child(parentid1, parentid2)
values (4, 4) -- fk violation, there is no 4,4 parent row
go
insert into dbo.child(parentid1, parentid2)
values (3, null) --do not get tricked here.... because the fk has a null value, the fk is NOT checked at all
go
--fk with one null value, fk is not checked at all
insert into dbo.child(parentid1, parentid2)
values (100, null) -- but there is no 100, null parent row
go
select *
from parent;
select *
from child;