Вопрос о ограничениях SQL

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

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

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

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

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

 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) 

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

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

  • Значение SqlServer ограничивает значение поля, зависящее от другого значения поля
  • Уникальный формат ограничения для неориентированного графика (1,2), предотвращения (2,1)
  • Помощь с ограничением
  • Сложная временная база данных с ограничениями между таблицами
  • Как разместить уникальные ограничения для нескольких столбцов
  • SQL Server Null Logical XOR
  • Могут ли быть ограничения с тем же именем в БД?
  • Поиск таблицы, к которой относится ограничение
  • SQL-ограничения или условие
  • MS SQL «ON DELETE CASCADE» несколько внешних ключей, указывающих на одну и ту же таблицу?
  • Удалить все записи, которые не имеют ограничений по внешнему ключу
  • Interesting Posts

    Планируется ли выполнение процедуры выполнения хранимых процедур сервера Sql при вызове c #?

    Выбрать в строке строки

    TSQL – как проверить значение по отношению к значению в другом столбце перед вставкой?

    Как объединить данные из разных столбцов из разных баз данных от разных поставщиков в одну таблицу?

    Столбец IsDeleted или IsDisabled

    Создание акцентированных символов SQL Server

    EF ef Database.SqlQuery внутренний откат в исполняемую хранимую процедуру

    SQL Server – запрос по часам, в течение нескольких дней

    Каков правильный тип SQL для хранения .Net Timespan со значениями <00:00:00? т.е. отрицательная временная шкала для хранимой процедуры сервера sql

    Как получить данные таблицы SQL Server полностью небольшими частями без индекса

    Как вы объединяете таблицы с первичными ключами autonumber?

    Как группировать по месяцам и годам, а также отделять записи?

    Как я могу использовать псевдоним в заявлении SUM?

    Самый быстрый способ найти разные совпадающие записи

    Сбросить автоинкремент в SQL Server после удаления

    Давайте будем гением компьютера.