Удалить из таблицы, которая используется в предложении where - PullRequest
2 голосов
/ 11 мая 2010

Я пишу небольшой скрипт для синхронизации 2 таблиц MySQL (t1 для «зеркалирования» в t2)

На шаге я хотел бы удалить строки внутри t2, которые были удалены в t1 с тем же идентификатором.

Я пробовал этот запрос:

delete from t2 where t2.id in 
    ( select t2.id left join t1 on (t1.id=t2.id) where t1.id is null )

Но Mysql запрещает мне одновременно использовать t2 при удалении и при выборе (кстати, звучит логично)

Конечно, я могу разделить запрос на 2 запроса: сначала выберите идентификаторы, затем удалите строки с этими идентификаторами.

Мой вопрос: есть ли у вас более чистый способ удаления строки из t2, которая больше не существует в t1? только с одним запросом?

Ответы [ 3 ]

0 голосов
/ 11 мая 2010

Этот запрос объединяет две таблицы и выбирает только те, у которых нет партнера в новой таблице, что позволяет вам удалить их за один раз:

DELETE t2 FROM t2
LEFT JOIN t1
ON t2.id = t1.id
WHERE t1.id IS NULL;
0 голосов
/ 11 мая 2010

Если вы используете левое соединение t1 против t2, значения для полей t1 будут равны NULL для любых строк, которые не совпадают в t2, поэтому это должно работать:

DELETE FROM t2
LEFT JOIN t1 ON t1.id = t2.id
WHERE t1.id IS NULL;
0 голосов
/ 11 мая 2010
delete t2.* 
from t2 
left join t1 on (t1.id=t2.id) 
where t1.id is null;
...