2010-08-31 6 views
2

Je dois supprimer certaines lignes d'une table. Les lignes à supprimer sont quelque chose que je découvre à travers une requête. Cependant, it appears that you cannot do both operations (select and delete) in the same query:SELECT et DELETE

Actuellement, vous ne pouvez pas supprimer d'une table et sélectionnez la même table dans une sous-requête.

Je ne peux pas le faire:

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 

Comment puis-je mettre en œuvre ce disque de nettoyage dans MySQL pur?

Le serveur fonctionne sous MySQL 5.1.39.

+0

Pourquoi faut-il être en MySQL "pure"? – NullUserException

+0

@NullUserException: Je ne veux pas ajouter un niveau de complexité supplémentaire (écrire un script PHP, le configurer via cron, tester s'il fonctionne correctement ...). En outre, le code SQL peut être déclenché directement à partir d'événements MySQL ou de routines stockées. –

Répondre

1

Essayez de faire la déclaration de suppression avec les jointures

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) 
+0

Très bien, merci. C'était ma première tentative mais je ne pouvais pas saisir la syntaxe correcte. –

1
CREATE TEMPORARY TABLE tmptable 
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) 

DELETE FROM telefono te 
WHERE te.telefono_id IN (Select telefono_id from tmptable) 
0

Utilisez UPDATE pour marquer les lignes pour la suppression, puis DELETE de les supprimer réellement.

UPDATE telefono SET marker_column='DELETE ME!!!!' WHERE telefono_id IN (...); 
DELETE FROM telefono WHERE marker_column='DELETE ME!!!!'; 
Questions connexes