Как использовать несколько имен таблиц в одном запросе на удаление - не все таблицы имеют данные

0

Что мне нужно

У меня есть база данных, называемая dbtuts, и у нее есть всего 7 таблиц.

Названия таблиц: tbl_uploads, вариация1, вариация2, вариация3, вариация 4, вариация5, вариация6.

Все эти таблицы имеют столбец prjId.

Я хочу удалить строку из таблицы tbl_uploads и из varitable1 в variabletable6, где prjId позволяет сказать xxxx.

Но проблема состоит в том, что вариация1 к вариации6 может иметь или не иметь этих данных xxxx для столбца prjId.

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

Мои коды

Я попытался сделать следующий путь, но он не работает.

$deleteQuery = "
DELETE 
  FROM dbtuts.tbl_uploads
     , dbtuts.variationtable1
     , dbtuts.variationtable2
     , dbtuts.variationtable3
     , dbtuts.variationtable4
     , dbtuts.variationtable5
     , dbtuts.variationtable6 
 WHERE prjId = 'xxxx'
 ";

$resultDeleteQuery = mysqli_query($conn,$deleteQuery);

У кого-нибудь есть идея?

  • 0
    Все ли таблицы, упомянутые в операторе удаления, имеют этот столбец prjId ?
  • 0
    Почему бы не иметь один вариабельный вместо 6?
Показать ещё 8 комментариев
Теги:
mysqli

2 ответа

2
Лучший ответ

Вы можете сделать это с помощью одного запроса, используя LEFT JOIN:

DELETE t, v1, v2, v3, v4, v5, v6
  FROM dbtuts.tbl_uploads t
  LEFT JOIN dbtuts.variationtable1 v1 ON t.prjId = v1.prjId
  LEFT JOIN dbtuts.variationtable2 v2 ON t.prjId = v2.prjId
  LEFT JOIN dbtuts.variationtable3 v3 ON t.prjId = v3.prjId
  LEFT JOIN dbtuts.variationtable4 v4 ON t.prjId = v4.prjId
  LEFT JOIN dbtuts.variationtable5 v5 ON t.prjId = v5.prjId
  LEFT JOIN dbtuts.variationtable6 v6 ON t.prjId = v6.prjId
WHERE t.prjId = 'xxxx'

Демо здесь

Примечание. Этот тип запроса не требуется, если схема базы данных была правильно разработана. Правильный способ реализации такого рода функциональности заключается в создании внешних ключей в каждой из таблиц dbtuts.variationtablex с ON CASCADE DELETE.

  • 0
    Это прекрасно работает для меня. Я новичок в MySQL. Таким образом, моя структура данных не может быть хорошей. Я не совсем понял ваши коды, хотя. Я постараюсь получить больше информации о методе JOIN в MySQL. Спасибо
1

Это был бы самый простой способ сделать это и в 1 запросе

$deleteQuery = "DELETE FROM dbtuts.tbl_uploads WHERE prjId = 'xxxx';
                DELETE FROM dbtuts.variationtable1 WHERE prjId = 'xxxx';
                DELETE FROM dbtuts.variationtable2 WHERE prjId = 'xxxx';
                DELETE FROM dbtuts.variationtable3 WHERE prjId = 'xxxx';
                DELETE FROM dbtuts.variationtable4 WHERE prjId = 'xxxx';
                DELETE FROM dbtuts.variationtable5 WHERE prjId = 'xxxx';
                DELETE FROM dbtuts.variationtable6 WHERE prjId = 'xxxx'";

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

$stmt = $mysqli->prepare("DELETE FROM dbtuts.tbl_uploads WHERE prjId = 'xxxx';
                          DELETE FROM dbtuts.variationtable1 WHERE prjId = 'xxxx';
                          DELETE FROM dbtuts.variationtable2 WHERE prjId = 'xxxx';
                          DELETE FROM dbtuts.variationtable3 WHERE prjId = 'xxxx';
                          DELETE FROM dbtuts.variationtable4 WHERE prjId = 'xxxx';
                          DELETE FROM dbtuts.variationtable5 WHERE prjId = 'xxxx';
                          DELETE FROM dbtuts.variationtable6 WHERE prjId = 'xxxx'";);
$stmt->execute(); 
$stmt->close();
  • 1
    Этот ответ более полный, чем мой, и был здесь первым. Это будет хорошо работать.
  • 0
    Я был бы обеспокоен безопасностью с подходом с несколькими запросами.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню