Ver Mensaje Individual
  #7 (permalink)  
Antiguo 16/04/2014, 07:12
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: DELETE de múltiples entradas en distintas tablas

Vamos a hacer un intento, a ver si funciona:
Código MySQL:
Ver original
  1. DELETE a, b, c
  2. FROM posts a INNER JOIN subcategories b ON a.idsubcategorie = b.idsubcategorie
  3. INNER JOIN categories c ON b.idcategorie = c.idcategorie
  4. WHERE c.idcategorie = valorIdABorrar
En teoría debería poder hacer el DELETE siendo tablas MyISAM. No funciona bien con las InnoDB porque MySQL no lee previamene la cadena de dependencias.
A mi no me gusta la forma porque si falla uno de los borrados de las tablas no hay rollback.

Un ejemplo de mi idea respecto al SP sería mas o menos así:
Código MySQL:
Ver original
  1. CREATE PROCEDURE borrar(IN idcat INT)
  2.     CREATE TEMPORARY TABLE posts_temp
  3.     SELECT * FROM posts
  4.     WHERE idsubcategory IN
  5.         (SELECT idsubcategory
  6.            FROM subcategories a
  7.                 INNER JOIN categories c ON s.idcategorie = c.idcategorie
  8.           WHERE c.idcategorie = idcat);
  9.     DELETE posts
  10.     WHERE idsubcategory IN
  11.          (SELECT idsubcategory
  12.             FROM subcategories a
  13.                  INNER JOIN categories c ON s.idcategorie = c.idcategorie
  14.            WHERE c.idcategorie = idcat);
  15.     IF ROW_COUNT()  = 0 THEN
  16.         REPLACE posts
  17.         SELECT *
  18.         FROM posts_temp;
  19.         SELECT 'Fallo al borrar posts.' resultado;
  20.     ELSE
  21.         CREATE TEMPORARY TABLE subcat_temp
  22.         SELECT * FROM subcategories
  23.            WHERE idcategory = idcat;
  24.         DELETE subcategories
  25.          WHERE idcategory = idcat;
  26.         IF ROW_COUNT() = 0 THEN
  27.             REPLACE posts
  28.             SELECT *
  29.             FROM posts_temp;
  30.             REPLACE subcategories
  31.             SELECT *
  32.             FROM subcat_temp;
  33.             SELECT 'Fallo al borrar subcategorias.' resultado;
  34.         ELSE
  35.             CREATE TEMPORARY TABLE cat_temp
  36.             SELECT * FROM categories
  37.                WHERE idcategory = idcat;
  38.             DELETE categories
  39.              WHERE idcategory = idcat;
  40.             IF ROW_COUNT() = 0 THEN
  41.                 REPLACE posts
  42.                 SELECT *
  43.                 FROM posts_temp;
  44.                 REPLACE subcategories
  45.                 SELECT *
  46.                 FROM subcat_temp;
  47.                 SELECT 'Fallo al borrar categoria' resultado;
  48.             ELSE
  49.                 SELECT 'Borrado exitoso' resultado;
  50.             END IF;            
  51.         END IF ;
  52.     END IF;
Aclaro que no lo he podido probar, por lo que puede contener muchos errores, y no sé si las versiones de MySQL posteriores a la 5.1.x soportan ROW_COUNT() .
Como nota, estoy haciendo que devuelva un result de mensaje, por lo que deberás recuperarlo al ejecutar el SP
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)