Выполнение SQL-запроса для удаления неиспользуемых пользователей из базы данных - PullRequest
0 голосов
/ 14 марта 2019

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

Я пытаюсь удалить все записи пользователей из таблицы «Пользователи», которые соответствуют следующим критериям:

  • Нет ссылки на запись в одной из таблиц документов.
  • Нет ссылки на запись в таблице разрешений.
  • Содержит нулевое значение в столбце «Идентификатор клиента» строки «Пользователь».

Я могу создать запрос для всех пользователей, который выглядит следующим образом:

SELECT id
INTO MyTableVar
FROM Users
WHERE
    (NOT EXISTS (SELECT Author_Id FROM ItemInstances_DocumentInstance 
                 WHERE Users.Id = ItemInstances_DocumentInstance.Author_Id)
    AND NOT EXISTS (SELECT CompletedBy_Id FROM TaskInstanceUser 
                    WHERE Users.Id = TaskInstanceUser.CompletedBy_Id)
    AND Cust_Id IS NULL
    AND Id > 4)

SELECT * 
FROM MyTableVar

Этот запрос получает все идентификаторы пользователей, которых я хочу удалить, но я получаю сообщение об ошибке при попытке удалить эти записи

Оператор DELETE конфликтует с ограничением REFERENCE "FK_MessageUser_User.

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

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

1 Ответ

0 голосов
/ 15 марта 2019

Я предполагаю, что таблица с внешним ключом не имеет ON DELETE CASCADE, о котором вы можете прочитать здесь .

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

ALTER TABLE MessageUser_User DROP 
   CONSTRAINT FK_MessageUser_User;

ALTER TABLE MessageUser_User ADD 
   CONSTRAINT FK_MessageUser_User
      FOREIGN KEY (<<IdColumnName>>)
      REFERENCES Users (Id)
      ON DELETE CASCADE;

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

DELETE FROM MessageUser_User WHERE ID IN (SELECT ID FROM MyTableVar );

Что касается стиля вашего запроса на удаление - я обычно предпочитаю делать левые объединения, а затем удалять записи, в которых в правой таблице (таблицах) есть ноль:

SELECT id
INTO MyTableVar
FROM Users
LEFT JOIN ItemInstances_DocumentInstance ON Author_Id = Users.Id
LEFT JOIN TastInstanceUser ON CompletedBy_Id = Users.Id
WHERE
Author_Id IS NULL
AND CompletedBy_Id IS NULL
AND Cust_Id IS NULL
AND Id > 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...