Как использовать несколько имен таблиц в одном запросе на удаление - не все таблицы имеют данные - PullRequest
0 голосов
/ 01 июня 2018

Что мне нужно

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

Имена таблиц: tbl_uploads, вариабельная1, вариабельная2, вариабельная3, вариабельная4, вариабельная5, вариабельная6.

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

Я хочу удалить строку из таблицы tbl_uploads и из вариабельной1 в вариабельную6, где 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);

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

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете сделать это с помощью одного запроса, используя 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 голосов
/ 01 июня 2018

Это был бы самый простой способ сделать это, и в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...