Вопрос об ограничениях SQL - PullRequest
3 голосов
/ 10 марта 2009

В Sql Server 2005 у меня есть таблица с двумя целочисленными столбцами, назовите их Id1 и Id2. Мне нужно, чтобы они были уникальными в таблице (достаточно просто с уникальным индексом, охватывающим оба столбца). Мне также нужно, чтобы они были уникальными в таблице, если значения транспонированы между двумя столбцами.

Например, SELECT * FROM MyTable возвращает

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

Как мне сделать ограничение, которое бы препятствовало вводу последней строки в таблицу, потому что это транспонированные значения из первой строки?

Ответы [ 3 ]

6 голосов
/ 10 марта 2009

Создайте проверочное ограничение, связанное с определенной пользователем функцией, которая выполняет выборку в таблице для проверки транспонированного значения.

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)
2 голосов
/ 10 марта 2009

Имеет ли значение порядок между Id1 и Id2? Если нет, и это большая таблица, может быть лучше выполнить Id1

0 голосов
/ 10 марта 2009

Я бы создал триггер, который выполнялся при вставке и обновлении, с помощью оператора select подтвердил бы, что значения были уникальными в двух столбцах, когда они транспонированы, а когда нет. Это позволит вам отклонить любые изменения в таблице, которые нарушат ваши правила уникальности в момент изменения, и вы сможете удалить уникальный индекс, потому что он обеспечивает только часть требования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...