Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Eindeutige Einschränkung für zwei Felder und ihr Gegenteil

Zwei Lösungen, bei denen es wirklich darum geht, das Problem in ein einfacheres zu verwandeln. Normalerweise bevorzuge ich den T1 Lösung, wenn es akzeptabel ist, Verbrauchern eine Änderung aufzuzwingen:

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

In beiden Fällen weder T1 noch T2 kann doppelte Werte in Lft,Rgt enthalten Paare.