sql >> Base de Datos >  >> RDS >> Sqlserver

Restricción única en dos campos y su opuesto

Dos soluciones, ambas realmente sobre cambiar el problema a uno más fácil. Normalmente prefiero el T1 solución si es aceptable forzar un cambio a los consumidores:

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

En ambos casos, ni T1 ni T2 puede contener valores duplicados en Lft,Rgt parejas.