Как сделать несколько условий ссылочной целостности в SQL - PullRequest
0 голосов
/ 21 мая 2019

У меня есть оператор SQL, который должен добавить мне некоторые ограничения. В этом утверждении я хочу установить для двух ограничений два условия ссылочной целостности.

Вот мое утверждение:

ALTER TABLE Vertraege
    ADD CONSTRAINT FK_Kunde_Vertraege FOREIGN KEY(K_ID)
        REFERENCES Kunde(K_ID),
    CONSTRAINT FK_Standort_Vertraege FOREIGN KEY(S_ID)
        REFERENCES Standort(S_ID) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT FK_Mitarbeiter_Vertraege FOREIGN KEY(M_ID)
        REFERENCES Mitarbeiter(M_ID) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT FK_Dienstleistung_Vertraege FOREIGN KEY(D_ID)
        REFERENCES Dienstleistung(D_ID),
    CONSTRAINT FK_Compliance_Vertraege FOREIGN KEY(C_ID)
        REFERENCES Compliance(C_ID);

Так что проблема в том, что я получаю ошибку из-за этого.

Notification 1785, level 16, status 0, line 28
Introducing FOREIGN KEY constraint 'FK_Mitarbeiter_Vertraege' on table 'vertreage' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Notification 1750, level 16, status 1, line 28
Could not create constraint or index. See previous errors.

Можно ли установить несколько условий ссылочной целостности, а если нет, как я могу создать несколько из них в SQL? Что-то вроде ALTER CONSTRAINT ...

EDIT

Брайан попросил об этом. На моем столе у ​​меня есть следующие ограничения. Странно то, что они работают

ALTER TABLE Mitarbeiter
    ADD CONSTRAINT FK_Adresse_Mitarbeiter FOREIGN KEY(AD_ID)
        REFERENCES Adresse(AD_ID) ON UPDATE CASCADE,
    CONSTRAINT FK_Standort_Mitarbeiter FOREIGN KEY(S_ID)
        REFERENCES Standort(S_ID) ON UPDATE CASCADE,
    CONSTRAINT FK_Abteilung_Mitarbeiter FOREIGN KEY(AB_ID)
        REFERENCES Abteilung(AB_ID) ON UPDATE CASCADE;

Ответы [ 2 ]

1 голос
/ 21 мая 2019

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

ALTER TABLE Vertraege
    CONSTRAINT FK_Standort_Vertraege FOREIGN KEY(S_ID)
        REFERENCES Standort(S_ID) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT FK_Mitarbeiter_Vertraege FOREIGN KEY(M_ID)
        REFERENCES Mitarbeiter(M_ID) ON UPDATE CASCADE ON DELETE CASCADE,

и

ALTER TABLE Mitarbeiter
    CONSTRAINT FK_Standort_Mitarbeiter FOREIGN KEY(S_ID)
        REFERENCES Standort(S_ID) ON UPDATE CASCADE,

Итак, у вас есть ограничение, которое идет прямо от Vertraege до Standort, а другое - от Vertraege до Mitarbeiter до Standort.Моим первым предложением было бы удалить FK_Standort_Vertraege и посмотреть, решит ли это вашу проблему.

1 голос
/ 21 мая 2019

Это предположение, так как вопрос не включает все связанные таблицы.

Вы пытаетесь создать ограничение внешнего ключа из таблицы Vertraege к таблице Mitarbeiter. Кажется, однако, что есть еще одно [обратное] ограничение внешнего ключа (не показано) из таблицы Mitarbeiter в таблицу Vertraege. Я не могу быть уверен, поскольку вы не включили определение таблицы Mitarbeiter.

SQL Server считает это "циклическим отношением". Это все "законно", однако. Ничего плохого в этом нет. Ну ... пока некоторые из них имеют значение nullable , или они могут быть отложенными (но SQL Server не реализует последнее). Циклические отношения могут включать не только две таблицы, но также три или более. Однако неясно, сколько таблиц задействовано.

Проблема связана с правилами «каскадного удаления / обновления», которые вы хотите указать. Эти правила могут привести к массовому удалению или обновлению данных с помощью простого безобидного DELETE или UPDATE, например:

delete from Vertraege where ID = 123

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

В любом случае, SQL Server не нравятся эти циклические каскадные удаления / обновления, поскольку он считает их [оправданными] опасными и решает не разрешать их.

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