Использовать два внешних ключа в таблице с ‘on delete cascade’

#sql #sql-server

#sql #sql-сервер

Вопрос:

 CREATE TABLE Comments(
    Id INT PRIMARY KEY IDENTITY(0,1),
    TEXT NOT NULL,
    Date Date NOT NULL ,
    Point INT NOT NULL DEFAULT(0), 
    ID_User INT FOREIGN KEY REFERENCES Users(Id) ON DELETE CASCADE NOT NULL,
    ID_Post INT FOREIGN KEY REFERENCES Posts(Id)  NOT NULL
)
  

Когда я удаляю пользователя из таблицы Users, он показывает мне ошибку, которую содержит таблица Comments
другой ссылочный ключ. Что я должен делать?

Оператор DELETE конфликтовал с ограничением ссылки «FK__Comments__ID_Pos__76969D2E». Конфликт произошел в базе данных Facebook, таблица dbo.Comments, столбец ‘ID_Post’.

Комментарии:

1. Не могли бы вы добавить точное сообщение об ошибке к вашему вопросу, пожалуйста.

2. Я предполагаю, что у вас есть каскадирование при удалении в вашу таблицу Posts из Users , но (как показано в вашем DDL выше) не на Comments из Posts . В результате, когда вы удаляете пользователя, он переходит к Posts и пытается удалить их. Однако при этом, поскольку нет каскада комментариев к комментариям (которые сделаны пользователями, которые не являются OP), они останутся «осиротевшими», и, следовательно, ошибка.

3. Исправление было бы также для ON DELETE CASCADE другого FK.

4. Вы знаете, в чем моя общая проблема? Когда я удаляю пользователя из таблицы Users, возникает проблема с ID_Post. Если я смогу удалить ID_Post как ID_User, проблема будет решена. Если пользователь удалил из таблицы Users сообщения пользователя, комментарии должны быть удалены одновременно

5. Да, поэтому добавьте ON DELETE CASCADE к обоим вашим внешним ключам.

Ответ №1:

Если вы хотите удалить запись пользователя, вам необходимо удалить записи в таблицах внешних ключей.

В этом случае вам нужно удалить записи в Comments таблице.

 DELETE from dbo.Commnts
Where ID_User = "userid"
  

Затем вы можете удалить запись пользователя из Users таблицы

Ответ №2:

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

это то, что я пробовал

 CREATE TABLE Users(
Id int primary key

)

CREATE TABLE posts(
Id int primary key
)

insert into Users values(1);
insert into Users values(2);

insert into posts values(3);
insert into posts values(4);


CREATE TABLE Comments(
    Id INT PRIMARY KEY IDENTITY(0,1),
    ID_User INT FOREIGN KEY REFERENCES Users(Id) ON DELETE CASCADE NOT NULL,
    ID_Post INT FOREIGN KEY REFERENCES Posts(Id)  NOT NULL
)

insert into Comments values(1,3);
insert into Comments values(2,4);

DELETE 
FROM Users
WHERE id = 1 --this works fine