Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Restrição única em dois campos e seu oposto


Duas soluções, ambas realmente sobre mudar o problema para um mais fácil. Eu normalmente prefiro o T1 solução se forçar uma mudança nos consumidores for aceitável:
create table dbo.T1 (
    Lft int not null,
    Rgt int not null,
    constraint CK_T1 CHECK (Lft < Rgt),
    constraint UQ_T1 UNIQUE (Lft,Rgt)
)
go
create table dbo.T2 (
    Lft int not null,
    Rgt int not null
)
go
create view dbo.T2_DRI
with schemabinding
as
    select
        CASE WHEN Lft<Rgt THEN Lft ELSE Rgt END as Lft,
        CASE WHEN Lft<Rgt THEN Rgt ELSE Lft END as Rgt
    from dbo.T2
go
create unique clustered index IX_T2_DRI on dbo.T2_DRI(Lft,Rgt)
go

Em ambos os casos, nem T1 nem T2 pode conter valores duplicados no Lft,Rgt pares.