ВЫБРАТЬ и УДАЛИТЬ

Мне нужно удалить определенные строки из таблицы. Какие строки должны быть удалены, я узнаю с помощью запроса. Однако, вы не можете выполнять обе операции (выбрать и удалить) в тот же запрос:

В настоящее время вы не можете удалить из таблицы и выбрать из той же таблицы в подзапросе.

Поэтому я не могу сделать это:

DELETE
FROM telefono
WHERE telefono_id IN (
    SELECT te.telefono_id
    FROM telefono te
    LEFT JOIN centro_telefono ce ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
    LEFT JOIN contacto_telefono co ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
    WHERE COALESCE(ce.telefono_id, co.telefono_id) IS NULL AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)
);
-- SQL Error (1093): You can't specify target table for update in FROM clause

Как я могу реализовать эту очистку записи в чистом MySQL?

На сервере работает MySQL 5.1.39.


person Álvaro González    schedule 31.08.2010    source источник
comment
Почему это должно быть в чистом MySQL?   -  person NullUserException    schedule 31.08.2010
comment
@NullUserException: я не хочу добавлять дополнительный уровень сложности (написание PHP-скрипта, его настройка через cron, проверка его успешного выполнения...). Кроме того, код SQL может запускаться непосредственно из событий MySQL или сохраненных подпрограмм.   -  person Álvaro González    schedule 31.08.2010


Ответы (2)


Попробуйте выполнить оператор удаления с соединениями

DELETE te
FROM telefono as te
    LEFT JOIN centro_telefono ce
        ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
    LEFT JOIN contacto_telefono co
        ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
WHERE
    COALESCE(ce.telefono_id, co.telefono_id) IS NULL
    AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)
person joshperry    schedule 31.08.2010
comment
Очень мило спасибо. Это была моя первая попытка, но я не мог понять правильный синтаксис. - person Álvaro González; 31.08.2010

Используйте UPDATE, чтобы пометить строки для удаления, затем DELETE, чтобы удалить их.

UPDATE telefono SET marker_column='DELETE ME!!!!' WHERE telefono_id IN (...);
DELETE FROM telefono WHERE marker_column='DELETE ME!!!!';
person dan04    schedule 31.08.2010