2009-03-10 14 views
3

Sql Server 2005'te iki tamsayı sütunlu bir tablonuz var, bunları Id1 ve Id2 olarak adlandırıyorum. Tabloda benzersiz olmalarına ihtiyacım var (her iki sütunu da kapsayan benzersiz bir endeksle yeterince kolay). Ayrıca, değerler iki sütun arasında aktarılırsa, tabloda benzersiz olmalarına da ihtiyacım var. ÖrneğinSQL Kısıtlamaları Soru

, MyTable SELECT * ilk satırdan aktarılmış değerlerdir çünkü

Id1 Id2 
--------- 
2  4 
5  8 
7  2 
4  2 <--- values transposed from the first row 

nasıl tabloya girilen olmaktan son satırı önleyecek bir sınırlama yapabilirim döner?

cevap

6

Dönüştürülen değeri kontrol etmek için tabloda bir seçim gerçekleştiren kullanıcı tanımlı bir işleve bağlı bir kontrol kısıtlaması oluşturun.

Create table mytable(id1 int, id2 int) 
go 

create Function dbo.fx_Transposed(@id1 int, @id2 int) 
returns bit as 
Begin 
    Declare @Ret bit 
    Set @ret = 0 
    if exists(Select 1 from MyTable 
     Where id2 = @id1 and id1 = @id2) 
    Set @ret = 1 
    Return @ret 
End 
GO 
Alter table mytable add 
CONSTRAINT [CHK_TRANSPOSE] CHECK 
(([dbo].[fx_Transposed]([ID1],[ID2])=(0))) 
GO 
Insert into mytable (id1, id2) values (1,2) 

Insert into mytable (id1, id2) values (2,1) 
+0

Teşekkürler, tam olarak aradığım şey ... –

2

Id1 ve Id2 arasındaki sıralamanın herhangi bir önemi var mı? Değilse ve bu büyük bir tablo ise, benzersiz dizininize ek olarak Id1 < Id2'yi uygulamak için daha fazla performans olabilir. Bu, herhangi bir işlem giriş kayıtlarını etkileyecektir, bu yüzden mümkün olmayabilir.

0

Ekleme ve güncelleştirme sırasında yürütülen bir tetikleyici, dönüştürüldüğünde ve aktarılmadığında değerlerin iki sütunda benzersiz olduğunu belirten bir seçim ifadesi kullanarak doğrulamayı yapardım. Bu, değişiklik noktasında benzersizliğiniz için kurallarınızı bozacak tablodaki değişiklikleri reddetmenize olanak tanır ve benzersiz dizini kaldırabilir, çünkü yalnızca gereksinimin bir bölümünü uygular.