2010-07-08 4 views
3

Я ищу для удаления информации в двух разных таблицах в 1 запросе на основе идентификатора.MySQL Удалить записи из 2 таблиц

Я пробовал несколько решений здесь для выполнения этой задачи, но до сих пор не выполнил то, что я пытаюсь сделать.

Таблица 1 - Содержание

---------- --------- 
ContentID | Content 
-------------------- 

Таблица 2 - Голосов

--------------------------- 
VoteID | ContentID | Vote 
--------------------------- 

Я хочу, чтобы удалить строку содержимого на основе его ID и любых или всех голосов (там может быть 0 голосов). Я делаю NOT хочу использовать транзакции, каскадировать удаляет или использовать 2 разных запроса.

Что лучше всего здесь - ЛЕВАЯ ВСТУПЛЕНИЕ? ВНУТРЕННЕЕ СОЕДИНЕНИЕ?

Любая помощь здесь будет принята с благодарностью.

+0

См [MySQL DELETE синтаксис] (http://dev.mysql.com/doc/refman/5.1/en/delete.html) и найдите * multiple-table DELETE *. – Mike

+0

MySQL поддерживает удаление нескольких таблиц, но стандартный SQL разрешает только удаление из одной таблицы для каждого оператора. Если вы планируете переносить это в другие базы данных, вам придется перезаписать его. –

ответ

7
DELETE Content, Votes 
FROM Content 
LEFT JOIN Votes 
ON Votes.ContentID = Content.ContentID 
WHERE Content.ContentID = ? 
1
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

Хотя это для трех таблиц, я уверен, что вы сможете приспособить его к вашим потребностям.

2

Если у вас есть отношение, вы можете попробовать с опцией ON DELETE CASCADE.

Другой вариант - создать хранимую процедуру и выполнить удаление за 2 шага, но только с одним вызовом сервера.

+2

Я не думаю, что это удовлетворяет * «Я НЕ хочу использовать транзакции, каскадные удаления или использовать 2 разных запроса» * clause ;-) – Mike

+0

Может быть, только хранимая часть процедуры, если проблема имеет только 1 сервер просьба ... Я признаю, что я пропустил часть «реквизитов» ответа;) – munissor

1

Вы можете указать несколько таблиц в инструкции DELETE для удаления строк из одной или нескольких таблиц в зависимости от конкретного условия в предложении WHERE. Однако вы не можете использовать ORDER BY или LIMIT в DELETE с несколькими таблицами. В предложении table_references перечислены таблицы, участвующие в объединении. Его синтаксис описан в разделе 12.2.7.1, «JOIN Syntax».

Первый синтаксис DELETE с несколькими таблицами поддерживается начиная с MySQL 4.0.0. Вторая поддерживается начиная с MySQL 4.0.2.

Для первого синтаксиса с несколькими таблицами удаляются только соответствующие строки из таблиц, перечисленных перед предложением FROM. Для второго синтаксиса с несколькими таблицами удаляются только сопоставление строк из таблиц, перечисленных в предложении FROM (перед предложением USING). Эффект в том, что вы можете удалять строки из нескольких таблиц в то же время и дополнительные таблицы, которые используются только для поиска:

DELETE t1, t2 FROM t1 INNER JOIN t2 t3 INNER JOIN WHERE t1.id = t2. id AND t2.id = t3.id;

Или:

DELETE FROM t1, t2 ИСПОЛЬЗОВАНИЕ t1 INNER JOIN t2 t3 INNER JOIN ГДЕ t1.id = t2.id И t2.id = t3.id;

Эти операторы используют все три таблицы при поиске строк для удаления, но удаляют соответствующие строки только из таблиц t1 и t2.

Эта ссылка может быть полезна «http://dev.mysql.com/doc/refman/4.1/en/delete.html»

+0

Так что же было бы здесь предложением WHERE? ContentId существует в таблице содержимого, но также может быть или не существовать в таблице голосов 1 или более раз. – barfoon

+1

DELETE Content, Votes FROM Content INNER JOIN Голосов, где Content.ContentID = Votes.ContentID и «применить ваше условие» – user386660

+0

@dilipchouhan: Внутреннее соединение предотвратит удаление записей контента, если в голосах не найдено совпадающих строк. Он должен быть левым соединением: 'DELETE Content, Votes FROM Content LEFT JOIN Votes ON Votes.ContentID = Content.ContentID WHERE Content.ContentID =?' – Mike

0

Без использования «СТАЛ» самый простой я мог придумать, пока я искал решение было DELETE a.*,b.* FROM table1 AS a, table2 AS b WHERE a.id = b.id AND a.field = 1

Смежные вопросы