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?
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.
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
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
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 /
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.
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]
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