para - truncate todas las tablas de una base de datos mysql
¿Cómo eliminar desde múltiples tablas en MySQL? (6)
Dado que esto parece ser una simple relación padre / hijo entre pets
y pets_activities
pets
, sería mejor que pets_activities
tu restricción de clave externa con una cascada de eliminación.
De esta forma, cuando se elimina una fila de pets
, también se eliminan pets_activities
filas de pets_activities
asociadas a ella.
Entonces su consulta se convierte en simple:
delete from `pets`
where `order` > :order
and `pet_id` = :pet_id
Estoy intentando eliminar de algunas 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 de SQL; verifique el manual que corresponde a su versión del 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 no tengo experiencia y estoy estancado por ahora!
¿Qué estoy haciendo mal?
La sintaxis me parece correcta ... intente cambiarla para usar INNER JOIN ...
Eche un vistazo a esto: http://www.electrictoolbox.com/article/mysql/cross-table-delete/
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 nuevas de mysql.
Para cualquiera que lea esto en 2017, así es como hice 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
En general, para eliminar filas de varias tablas, la sintaxis que sigo se proporciona a continuación. La solución se basa en la suposición 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]
Utilizar esta
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
Use un JOIN
en la declaració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 puedes 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
... para eliminar solo de pets_activities
Ver http://dev.mysql.com/doc/refman/5.0/en/delete.html
Para las eliminaciones de tablas individuales, pero con integridad referencial, hay otras formas de hacerlo con EXISTS, NOT EXISTS, IN, NOT IN, etc. Pero el anterior donde se especifica desde qué tablas se debe eliminar con un alias antes de que la cláusula FROM pueda obtener salir de unos pocos lugares muy difíciles con mayor facilidad. Tiendo a llegar a un EXISTE en el 99% de los casos y luego está el 1% donde esta sintaxis de MySQL toma el día.