3

Sql Server 2005には、Id1とId2という2つの整数列を持つテーブルがあります。テーブル内で一意である必要があります(両方の列にまたがる一意のインデックスで十分簡単です)。また、値が2つの列の間で転置される場合は、テーブル内で一意である必要があります。

たとえば、SELECT *FROMMyTableは

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

最後の行は最初の行から転置された値であるため、最後の行がテーブルに入力されないようにする制約を作成するにはどうすればよいですか?

4

3 に答える 3

6

転置された値をチェックするためにテーブルで選択を実行するユーザー定義関数にバインドされるチェック制約を作成します。

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)
于 2009-03-10T19:53:31.193 に答える
2

Id1 と Id2 の順序に意味はありますか? そうではなく、これが大きなテーブルである場合は、一意のインデックスに加えて Id1 < Id2 を適用すると、パフォーマンスが向上する可能性があります。これは、レコードを入力するプロセスに影響を与えるため、実行できない可能性があります。

于 2009-03-10T20:02:11.500 に答える
0

挿入および更新時に実行されるトリガーを作成し、select ステートメントを使用して、転置された場合と転置されていない場合の 2 つの列で値が一意であることを確認します。これにより、変更の時点で一意性のルールに違反するテーブルへの変更を拒否でき、要件の一部のみを適用するため、一意のインデックスを削除できます。

于 2009-03-10T20:06:54.793 に答える