Создание ограничения на две колонки комбинации MSSQL - PullRequest
0 голосов
/ 07 июня 2018

У меня есть таблица с двумя именами столбцов Родитель и Дочерний с данными, указанными ниже.

|     Parent          |     Child        |
|---------------------|------------------|
|      100            |      101         |
|---------------------|------------------|

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

ALTER TABLE Example ADD CONSTRAINT UC_Example UNIQUE (parent,child);

Теперь, если я попытаюсь вставить 100 в родительский элемент и 101 в дочерний элемент, происходит сбой, что является правильнымно я хотел бы остановить обратную вставку также Пример: 101 в родительском и 100 в дочернем должно также не работать

Есть ли способ сделать с помощью sql или процедурыили любая предопределенная команда sql

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

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

alter table example add min_id as (case when parentId < childId then parentId else childId end) persisted;

alter table example add max_id as (case when parentId < childId then childId else parentId end) persisted;

Теперь вы можете создать уникальный индекс / ограничение:

alter table example add constraint unq_parent_child
    unique (min_id, max_id);
0 голосов
/ 07 июня 2018

Вот пример с ограничением функции:

CREATE TABLE Tab1 (
    Parent INT
    ,Child INT
    )

INSERT INTO Tab1
  VALUES (100,101),(100,102)
GO

---------------------------------------------------------------------------------------------------------------------------

CREATE FUNCTION dbo.fnc_RestrictedInsert (@NewParent INT, @NewChild INT)
RETURNS BIT
AS
BEGIN
    DECLARE @Count INT = 0;
    DECLARE @RetVal BIT = 1;

    SELECT @Count = COUNT(*)
      FROM Tab1
      WHERE (Parent = @NewParent AND Child = @NewChild)
        OR (Child = @NewParent AND Parent = @NewChild)

    SET @RetVal = CASE 
            WHEN @Count > 1
                THEN 0
            ELSE 1
            END

    RETURN @RetVal;
END

---------------------------------------------------------------------------------------------------------------------------

ALTER TABLE Tab1 WITH NOCHECK ADD CONSTRAINT [CK_Ins] CHECK (([dbo].[fnc_RestrictedInsert]([Parent], [Child]) = (1)))

---------------------------------------------------------------------------------------------------------------------------

INSERT INTO Tab1 VALUES (100,101)
INSERT INTO Tab1 VALUES (101,100)

INSERT INTO Tab1 VALUES (100,103)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...