O SQL Server tem uma peculiaridade com colunas exclusivas opcionais: você não pode ter mais de uma null
em uma tabela.
Por exemplo:
create table employees (
id int identity(1,1) primary key,
givenname nvarchar(24) not null,
familyname varchar(24) not null,
tfn char(9) unique -- optional, but unique
);
(Na Austrália, temos um Tax File Number, que é exclusivo para o contribuinte).
O seguinte é uma solução alternativa:
create table employees (
id int identity(1,1) primary key,
givenname nvarchar(24) not null,
familyname varchar(24) not null,
tfn char(9)
);
CREATE UNIQUE NONCLUSTERED INDEX uq_employees_tfn ON employees(tfn)
WHERE tfn IS NOT NULL;
É possível nomear uma restrição exclusiva e dar a ela a condição acima de maneira semelhante ao primeiro exemplo? Ou seja, é possível incluir a restrição mais complexa em linha com a definição da coluna?
Sim, o seguinte funciona (somente no SQL Server 2016 em diante):
A sintaxe embutida resulta no mesmo índice filtrado exclusivo do arquivo
CREATE UNIQUE INDEX
. O DDL subsequente precisará gerenciá-lo como um índice em vez de uma restrição.Não é brilhantemente claro na
CREATE TABLE
documentação , mas é ilustrado no Exemplo S.A resposta de Paul White é excelente para versões do SQL Server e outros RDBMS que suportam índices filtrados. Para outros sistemas de banco de dados, uma boa maneira de contornar isso seria ter uma tabela filha separada para conter a coluna exclusiva, mas opcional.
As tabelas estariam em uma relação 1:1 opcional (ou seja, 1:0-1). A tabela filha ficaria assim:
Você também pode definir uma visão à qual se une externamente
tfns
paraemployees
mostrar todas as colunas de ambas as tabelas juntas.