Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Contrainte unique sur deux champs, et leur opposé

Deux solutions, toutes deux vraiment pour changer le problème en un problème plus facile. Je préfère généralement le T1 solution s'il est acceptable d'imposer un changement aux consommateurs :

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

Dans les deux cas, ni T1 ni T2 peut contenir des valeurs en double dans le Lft,Rgt paires.