Ваши объединения являются внутренними объединениями, поэтому только когда данные находятся во всех трех таблицах, у вас будет результат для удаления (набор результатов ваших объединений).
При условии, что вы хотите сделать следующее:
- Удалить роль
roles.ROLEID = <some_role_id>
- Удалить все
user_role
записей с user_role.ROLEID = <some_role_id>
- Удалить все
role_perm
записей с user_role.ROLEID = <some_role_id>
Преобразуйте их в левые внешние объединения, с первой таблицей - основной, от которой зависят все остальные.
DELETE t1, t2, t3
FROM roles as t1
LEFT JOIN user_role as t2 on t1.ROLEID = t2.ROLEID
LEFT JOIN role_perm as t3 on t1.ROLEID = t3.ROLEID
WHERE t1.ROLEID = $role_id
Выше будет работать без ограничения внешнего ключа каскада.Если у вас есть каскад и предполагается, что он находится на внешних ключах, привязанных к roles.ROLEID
, вам понадобится только DELETE t1 FROM...
, так как удаление будет каскадным для всех других таблиц.
Таким образом, если оба user_role
и role_perm
у меня есть каскадные FK на roles.ROLEID
:
DELETE FROM roles WHERE t1.ROLEID = $role_id;
Теперь я бегу как чума от каскадных FK и предпочитаю явное удаление первого запроса.Думаю, в моей жизни было слишком много неожиданных каскадных удалений.