Можно ли определить внешний ключ, поля которого принадлежат разным, но связанным таблицам? - PullRequest
0 голосов
/ 30 октября 2011

С учетом четырех таблиц:

CREATE TABLE LIST_A (
    A INT,
    PRIMARY KEY (A)
)

CREATE TABLE LIST_B (
    A INT,
    B INT,
    PRIMARY KEY (A, B),
    FOREIGN KEY (A) REFERENCES LIST_A (A)
)

CREATE TABLE LIST_C (
    C INT,
    A INT,
    PRIMARY KEY (C),
    FOREIGN KEY (A) REFERENCES LIST_A (A)
)

CREATE TABLE LIST_D (
    C INT,
    D INT,
    B INT,
    PRIMARY KEY (C, D),
    FOREIGN KEY (C) REFERENCES LIST_C (C)
)

Я хочу добавить еще одно ограничение: учитывая строку в LIST_D, основной номер которой (C0,D0), и родительскую строку в LIST_C, основной ключ которой C0, пара (LIST_C.A, LIST_D.B) должна ссылаться LIST_B (A, B). Как мне реализовать это в SQL Server 2008 R2?

1 Ответ

2 голосов
/ 31 октября 2011

Я думаю, что важно (и для нас, и для вас) знать цель добавления дополнительного внешнего ключа?

В зависимости от конкретной проблемы, которую вы пытаетесь решить (проверка данных при вводе, каскадное удаление и т. Д.) И гибкости, которую вы имеете для их решения (способность или неспособность изменить структуру данных), вы можете реализоватьлогические ограничения через триггеры.Мы используем этот подход в тех случаях, когда нам просто нужно перехватить граничные условия, которые должны происходить редко, если вообще когда-либо возникали.

Если триггеров недостаточно для вашей ситуации и требуются внешние ключи, тогда об единственной опции, которая у вас естьслева (без перепроектирования всех таблиц) - сохранить LIST_C.A в LIST_D, а затем создать FKey обратно в LIST_B.

Другой вариант - перепроектировать его так, чтобы у вас были промежуточные таблицы, содержащие соответствующие ссылки.между всеми таблицами, но это не звучит так, как это желательно.

...