Пожалуйста, не могли бы вы помочь мне, как удалить данные из более чем 1 таблицы всего за один запрос?
У меня есть эта структура таблиц:
products
texts
files
products_files — здесь отображаются файлы для продуктов — product_id, file_id
текстовые_файлы — здесь сопоставляются файлы с текстами — text_id, file_id
И мне нужно сделать это:
Если я удаляю файл с идентификатором 50, мне нужно удалить все строки из products_files и text_files, где file_id = 50.
Вы знаете, как это сделать?
Я пытался использовать левое соединение, но безрезультатно …
$query = 'DELETE products_files, texts_files FROM products_files
LEFT JOIN texts_files ON texts_files.file_id = products_files.file_id
WHERE products_files.file_id = '.$id.' OR texts_files.file_id = '.$id.'';
Вам может понадобиться ON DELETE CASCADE
функциональность. Однако используйте его осторожно, так как это может привести к неожиданным последствиям:
http://www.mysqltutorial.org/mysql-on-delete-cascade/
Если вы добавите ON DELETE CASCADE
в вашем create table
-вопрос, вы можете удалить любой элемент из него. Если есть какие-либо ограничения внешнего ключа, mysql автоматически следует за соединением и также удаляет записи в другой таблице.
Если вы хотите остаться на безопасной стороне (рекомендуется), вам нужно будет использовать несколько операторов удаления.
Вы можете указать, из какой таблицы удалить, добавив префикс *
с именем таблицы: DELETE table. * FROM table1 JOIN table2 JOIN … WHERE … Предложение WHERE указывает, какие строки следует удалить.
Попробуй это:
DELETE f1,f2
FROM products_files f1
INNER JOIN texts_files f2 ON f1.file_id = f2.file_id
WHERE f1.file_id = '.$id.';
ИЛИ ЖЕ
использовать ограничения внешнего ключа MySQL
Ограничения внешнего ключа MySQL, каскадное удаление
По сути, ваш запрос мне кажется нормальным (за исключением LEFT JOIN) — это не работает …
DELETE pf
, tf
FROM products_files pf
JOIN texts_files tf
ON tf.file_id = pf.file_id
WHERE pf.file_id = $id;