Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION не работает - PullRequest
0 голосов
/ 07 мая 2020

Когда я создаю таблицу UV (таблица, содержащая внешние ключи), таблица работает без ошибок.

Но когда я хочу обновить или удалить какой-то внешний ключ ... запрос не работает. Итак, я понял, что должен добавить on update cascade on delete cascade для каждого внешнего ключа.

Проблема в том, что у меня есть ссылки на внешние ключи 2 столбца для первичного ключа в table formateur ()

Это мое творение

create table formateur
(
    num_formateur int primary key ,
    nom_formateur varchar(30),
    prenom_formateur varchar(30),
    telephone nvarchar(12),
    adresse nvarchar(300),
    typee varchar(30)
)

create table formation
(
    num_formation int primary key,
    nom_formation varchar(30),
    nombre_UV int,
    motdepasse nvarchar(30)
)

create table UV
(
    num_UV int primary key,
    nom_UV varchar(30),
    masse_horaire_prevue int,
    num_formateur_enseignant int foreign key  references formateur(num_formateur) on update cascade on delete cascade  ,
    num_formateur_responsable int foreign key   references formateur(num_formateur) on update cascade on delete cascade ,
    num_formation int foreign key   references formation(num_formation) on update cascade on delete cascade
)


insert into formateur values('1','nom_formateur','prenom_formateur','342343412','adresse','responsable')
insert into formateur values('2','nom_formateur','prenom_formateur','342343412','adresse','responsable')
insert into formateur values('3','nom_formateur','prenom_formateur','342343412','adresse','enseignant')
insert into formateur values('4','nom_formateur','prenom_formateur','342343412','adresse','enseignant')


insert into formation values ('1','nom_formation','123','1')
insert into formation values ('2','nom_formation','123','1')
insert into formation values ('3','nom_formation','123','1')
insert into formation values ('4','nom_formation','123','1')

insert into UV values('1','nom_UV','23','3','1','1')
insert into UV values('2','nom_uv','43','4','2','1')
insert into UV values('3','nom_uv','63','4','2','1')
insert into UV values('4','nom_uv','73','4','2','1')

1 Ответ

1 голос
/ 07 мая 2020

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

Вы можете создать триггер на DELETE вместо создания FK с помощью CASCADE и удалите записи из [formateur], или просто создайте отдельные таблицы для каждого столбца (formateur1 и formateur2, что-то в этом роде).

Кроме того, я заметил, что ваши данные в UV не имеют уникальных значений в столбцах num_formateur_enseignant и num_formateur_responsable.

Вы уверены, что хотите удалить записи, поскольку их можно повторно использовать в разных строках?

Если вы используете триггер

CREATE OR ALTER TRIGGER TRG_UV_DELETE
on UV
INSTEAD OF DELETE
AS
BEGIN
    set nocount on

    DELETE UV
    FROM UV
        INNER JOIN DELETED
            ON UV.num_UV = DELETED.num_UV

    DELETE formation
    FROM formation
        INNER JOIN DELETED
            ON formation.num_formation = DELETED.num_formation

    delete formateur
    from formateur
    INNER JOIN DELETED
        ON formateur.num_formateur IN (DELETED.num_formateur_enseignant, DELETED.num_formateur_responsable) 
END

и заполните таблицу следующим образом:

insert into UV values('1','nom_UV','23','1','2','1')
insert into UV values('2','nom_uv','43','3','4','2')

триггер сработает.

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