Удалить реляционный запрос Mysql - PullRequest
0 голосов
/ 07 мая 2018

Мне нужно исправить этот запрос:

DELETE t1, t2, t3
FROM roles as t1
JOIN user_role as t2 on t1.ROLEID = t2.ROLEID
JOIN role_perm as t3 on t1.ROLEID = t3.ROLEID
WHERE t1.ROLEID = $role_id"

«user_role» и «role_perm» связаны с ролями и имеют DELETE ON CASCADE.

Но когда я попытался удалить строку, если я не добавил данные в user_role или role_perm, строка не может быть удалена, только когда я добавил данные в три таблицы, строка удаляется.

Ответы [ 4 ]

0 голосов
/ 07 мая 2018

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

Попробуйте удалить, используя left join или только в родительской таблице, если delete cascade активно для всех таблиц

0 голосов
/ 07 мая 2018

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

При условии, что вы хотите сделать следующее:

  • Удалить роль 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 и предпочитаю явное удаление первого запроса.Думаю, в моей жизни было слишком много неожиданных каскадных удалений.

0 голосов
/ 07 мая 2018

Вам не нужно удалять строки из дочерних таблиц "user_role" и "role_perm", как вы сказали, что есть DELETE ON CASCADE.

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

Попробуйте ниже SQL:

DELETE roles
WHERE ROLEID = $role_id
0 голосов
/ 07 мая 2018

С логической точки зрения объединение трех таблиц создает таблицу LOGICAL , которая затем обрабатывается вашей командой.

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

С точки зрения программирования то, что вы пытаетесь сделать, не очень рекомендуется.

...