Операция удаления в SQL с присоединением к нему - PullRequest
0 голосов
/ 25 июля 2011

У меня есть две таблицы, пользователь и бан.Пользовательская таблица имеет два столбца id и type.Запрет таблицы также имеет две колонки userID и bannedUserID.Я хочу удалить записи в таблице ban, где bannedUserID имеет type из 'Admin'.

Я пришел с таким запросом, но не уверен, является ли он правильным или нет.1010 *

DELETE FROM ban WHERE ban.bannedUserID IN (SELECT id FROM user WHERE type = 'Admin')

Это правильно?Нужно ли что-нибудь добавлять / удалять?

1 Ответ

4 голосов
/ 25 июля 2011

Если вы не уверены в правильности удаления, вы можете проверить его путем преобразования в эквивалентный SELECT:

SELECT b.bannedUserID 
FROM ban b JOIN user u ON b.bannedUserID = u.id
WHERE u.type = 'Admin';

Идентификаторы, возвращаемые этим запросом, те, которые вы хотите УДАЛИТЬ?

Затем попробуйте выполнить транзакцию (если вы используете механизм хранения, который поддерживает транзакции, т. Е. Не MyISAM), чтобы при необходимости можно было выполнить откат:

START TRANSACTION;

DELETE b 
FROM ban b JOIN user u ON b.bannedUserID = u.id
WHERE u.type = 'Admin';

/* do some SELECT to see if the correct rows have been deleted and no others */
/* but if anything appears wrong, and ban is an InnoDB table, you can... */

ROLLBACK;

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

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