Как применить это ограничение на сервере sql

У меня есть таблица с именем city и таблица с именем city_city. city_city сопоставляет две записи города, поэтому у него есть fromcity_id и tocity_id. Я могу обеспечить уникальность fromcity_id и и tocity_id с помощью уникального ключа, но как мне обеспечить уникальность, чтобы я не мог вставить запись, если fromcity_id и tocity_id меняются местами.

Например, следующие записи концептуально одинаковы:

id    fromcity_id  tocity_id
1     100          200
2     200          100

person Jeremy    schedule 21.04.2010    source источник


Ответы (3)


Для этого потребуется триггер, потому что вам нужно проверить другие строки. Кроме того, вы можете сделать это на прикладном уровне.

person D'Arcy Rittich    schedule 21.04.2010

Другой вариант — создать индексированное представление с уникальным ограничением на представление (ужасно, но тоже сработает). Вид будет примерно таким:

CREATE VIEW vwSomeView WITH SCHEMABINDING
AS
    SELECT fromcity_id AS 'C1', tocity_id AS 'C2' FROM city_city
    UNION ALL
    SELECT tocity_id AS 'C1', fromcity_id AS 'C2' FROM city_city

Затем создайте уникальный индекс для представления:

CREATE UNIQUE INDEX UIX_vwSomeView ON vwSomeView (C1, C2)

Вопрос в том, имеет ли это больше, меньше или примерно столько же накладных расходов, что и триггер, который выбирает таблицу при каждой вставке. Ответ на этот вопрос заключается в профилировании и тестировании вашей рабочей нагрузки, объемов данных и пропускной способности.

person Chris J    schedule 21.04.2010

Добавьте принудительное ограничение проверки (fromcity_id ‹ tocity_id), и все готово.

person A-K    schedule 21.04.2010