Как исправить запрос MySQL с двумя условиями, чтобы он работал правильно?

Что нужно изменить в моем запросе DELETE FROM joom_user_usergroup_map m WHERE NOT EXISTS (SELECT * FROM joom_users u WHERE u.id = m.user_id); чтобы он корректно выполнился? В то же время, мой SELECT запрос работает правильно.
  • 5 февраля 2024 г. 17:42
Ответы на вопрос 2
В вашем запросе DELETE вы пытаетесь удалить записи из таблицы `joom_user_usergroup_map`, которые не имеют соответствующих записей в таблице `joom_users`. Чтобы запрос работал корректно, я предполагаю, что ваш SELECT запрос выглядит примерно так:

```sql
SELECT *
FROM joom_user_usergroup_map m
WHERE NOT EXISTS (
    SELECT * FROM joom_users u WHERE u.id = m.user_id
);
```

Если SELECT запрос работает правильно и возвращает те строки, которые вы хотите удалить, тогда ваш DELETE запрос должен работать так же (с учетом корректной организации JOIN’ов и правильной логике условий). Но возможно, что имеется ограничение внешнего ключа или другая проблема, которая не дает выполнить запрос DELETE.

Одна из возможных причин, по которой DELETE запрос может работать некорректно - более строгие требования MySQL к подзапросам в блоке DELETE, в отличие от блока SELECT. Вы можете попробовать переписать запрос с использованием LEFT JOIN и проверки на NULL, которая будет проверять отсутствие связанных записей в таблице `joom_users`:

```sql
DELETE m
FROM joom_user_usergroup_map m
LEFT JOIN joom_users u ON m.user_id = u.id
WHERE u.id IS NULL;
```

Этот запрос удалит все записи из таблицы `joom_user_usergroup_map`, для которых не найдено соответствие в таблице `joom_users`, что и является вашим условием.

Убедитесь, что перед выполнением запроса DELETE вы имеете backup необходимых данных, так как операция удаления необратима. Также, если ваша таблица использует внешние ключи с каскадным удалением, осторожно используйте DELETE запросы, чтобы не удалить более того, что вы задумывали.
DELETE FROM joom_user_usergroup_map -- m - забудьте про алиасы в делетах, пока работаете в MariaDB !
WHERE NOT EXISTS (SELECT * FROM joom_users u WHERE u.id = joom_user_usergroup_map.user_id -- будьте добры указывать имя таблицы полностью, которую обрабатывает delete
);
Похожие вопросы