Что мне нужно
У меня есть база данных, называемая 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);
У кого-нибудь есть идея?
Вы можете сделать это с помощью одного запроса, используя 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
.
Это был бы самый простой способ сделать это и в 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();
prjId
?