Вот скрипт для создания моих таблиц:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
В моем PHP-коде при удалении клиента я хочу удалить все сообщения проектов:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
Таблица сообщений не имеет внешний ключ client_id
, только project_id
. Я хочу удалить сообщения в проектах, которые прошли client_id
.
Это не работает сейчас, потому что ни один пост не удален.
DELETE posts FROM posts JOIN projects ...
, а неIN (subquery)
шаблон. (Ответ от Yehosef приводит пример предпочтительного паттерна.)alias
для имени таблицы и использовать это.Ответы:
Вам просто нужно указать, что вы хотите удалить записи из
posts
таблицы:РЕДАКТИРОВАТЬ: Для получения дополнительной информации вы можете увидеть этот альтернативный ответ
источник
DELETE d FROM posts AS d JOIN projects AS p ON ...
DELETE posts , projects FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id
Поскольку вы выбираете несколько таблиц, таблица для удаления больше не является однозначной. Вам необходимо выбрать :
В этом случае
table_name1
иtable_name2
те же таблицы, так что это будет работать:Вы даже можете удалить из обеих таблиц, если хотите:
Обратите внимание, что
order by
иlimit
не работает для удаления нескольких таблиц .Также учтите, что если вы объявляете псевдоним для таблицы, вы должны использовать псевдоним при обращении к таблице:
Взносы от Carpetsmoker и др .
источник
ON
заглавными. Менее опытным разработчикам может показаться, что это нормально - быть грязным и непоследовательным с точки зрения стиля.Или то же самое, с немного другим (более дружелюбным) синтаксисом:
Кстати, с MySQL использование соединений почти всегда намного быстрее, чем подзапросы ...
источник
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-usingВы также можете использовать ALIAS, как это работает, просто использовал его в моей базе данных! т это таблица должна быть удалена из!
источник
Я более привык к решению подзапроса, но я не пробовал его в MySQL:
источник
MySQL УДАЛИТЬ записи с JOIN
Обычно вы используете INNER JOIN в операторе SELECT для выбора записей из таблицы, которые имеют соответствующие записи в других таблицах. Мы также можем использовать предложение INNER JOIN с оператором DELETE для удаления записей из таблицы, а также соответствующих записей в других таблицах, например, чтобы удалить записи из таблиц T1 и T2, которые удовлетворяют определенному условию, вы используете следующий оператор:
Обратите внимание, что вы помещаете имена таблиц T1 и T2 между DELETE и FROM. Если вы опустите таблицу T1, оператор DELETE удалит только записи в таблице T2, а если вы опустите таблицу T2, будут удалены только записи в таблице T1.
Условие соединения T1.key = T2.key указывает соответствующие записи в таблице T2, которые необходимо удалить.
Условие в предложении WHERE указывает, какие записи в T1 и T2 необходимо удалить.
источник
Удаление одной таблицы:
Чтобы удалить записи из
posts
таблицы:Чтобы удалить записи из
projects
таблицы:Чтобы удалить записи из
clients
таблицы:Удалить несколько таблиц:
Чтобы удалить записи из нескольких таблиц из объединенных результатов, необходимо указать имена таблиц после
DELETE
списка, разделенного запятыми:Предположим , вы хотите удалить записи из всех трех таблиц (
posts
,projects
,clients
) для конкретного клиента:источник
Попробуйте как ниже:
источник
Другой способ удаления с использованием вложенного выбора, который лучше, чем использование
IN
, будетWHERE
EXISTS
Одна из причин использовать это вместо объединения - то, что
DELETE
сJOIN
запрещает использованиеLIMIT
. Если вы хотите удалить блоки, чтобы не создавать полных блокировок таблицы, вы можете добавитьLIMIT
использовать этотDELETE WHERE EXISTS
метод.источник
posts
внутри EXISTS () то же самое,posts
что строки удаляются. (ИМХО в любом случае)DELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
УДАЛИТЬ записи из одной таблицы:
УДАЛИТЬ ЗАПИСИ ИЗ обеих таблиц:
источник
Если объединение не работает для вас, вы можете попробовать это решение. Он предназначен для удаления потерянных записей из t1, когда не используются внешние ключи + определенное условие где. Т.е. он удаляет записи из таблицы 1, которые имеют пустое поле «код» и которые не имеют записей в таблице 2, совпадая по полю «имя».
источник
Попробуй это,
источник
- Обратите внимание, что вы не можете использовать псевдоним над таблицей, где вам нужно удалить
источник