Cómo eliminar de varias tablas en MySQL?


Estoy tratando de eliminar de unas pocas tablas a la vez. He hecho un poco de investigación, y se me ocurrió esto

DELETE FROM `pets` p,
            `pets_activities` pa
      WHERE p.`order` > :order
        AND p.`pet_id` = :pet_id
        AND pa.`id` = p.`pet_id`

Sin embargo, estoy recibiendo este error

Uncaught Database_Exception [ 1064]: Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para la sintaxis correcta para usar cerca de 'p, pets_activities pa...

Nunca he hecho una eliminación de tabla cruzada antes, así que estoy inexperto y atascado por ahora!

¿Qué estoy haciendo mal?

Author: Sam, 2010-07-26

6 answers

Utilice un JOIN en la instrucción DELETE.

DELETE p, pa
      FROM pets p
      JOIN pets_activities pa ON pa.id = p.pet_id
     WHERE p.order > :order
       AND p.pet_id = :pet_id

Alternativamente puede usar...

DELETE pa
      FROM pets_activities pa
      JOIN pets p ON pa.id = p.pet_id
 WHERE p.order > :order
   AND p.pet_id = :pet_id

Delete para borrar solo de pets_activities

Véase http://dev.mysql.com/doc/refman/5.0/en/delete.html

Para las eliminaciones de una sola tabla, pero con integridad referencial, hay otras formas de hacer con EXISTS, NOT EXISTS, IN, NOT IN, etc. Pero la anterior en la que especifica de qué tablas eliminar con un alias antes de la cláusula FROM puede sacarle de un pocos lugares bastante estrechos más fácilmente. Tiendo a llegar a un EXISTE en el 99% de los casos y luego está el 1% donde esta sintaxis MySQL toma el día.

 173
Author: cadman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-19 11:04:06

Dado que esto parece ser una relación simple padre/hijo entre pets y pets_activities, sería mejor crear su restricción de clave foránea con una cascada de eliminación.

De esta manera, cuando se elimina una fila pets, las filas pets_activities asociadas a ella también se eliminan automáticamente.

Entonces su consulta se vuelve simple:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
 18
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-24 20:13:33

Use esto

DELETE FROM `articles`, `comments` 
USING `articles`,`comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

O

DELETE `articles`, `comments` 
FROM `articles`, `comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
 12
Author: RN Kushwaha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-20 05:08:33

La sintaxis me parece correcta ... trate de cambiarlo para usar UNIÓN INTERIOR ...

Echa un vistazo a esto: http://www.electrictoolbox.com/article/mysql/cross-table-delete /

 2
Author: Andre Gallo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-26 03:13:41

No tengo una base de datos mysql para probar en este momento, pero ¿ha intentado especificar qué eliminar antes de la cláusula from? Por ejemplo:

DELETE p, pa FROM `pets` p,
        `pets_activities` pa
  WHERE p.`order` > :order
    AND p.`pet_id` = :pet_id
    AND pa.`id` = p.`pet_id`

Creo que la sintaxis que usaste está limitada a las versiones más recientes de mysql.

 2
Author: Brandon Horsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-26 03:51:28

Para cualquiera que lea esto en 2017, así es como he hecho algo similar.

DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND 
pets.`pet_id` = :pet_id

Generalmente, para eliminar filas de varias tablas, la sintaxis que sigo se da a continuación. La solución se basa en el supuesto de que existe alguna relación entre las dos tablas.

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]
 1
Author: Kalesh Kaladharan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 08:38:31