Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] DELETE de múltiples entradas en distintas tablas

Estas en el tema de DELETE de múltiples entradas en distintas tablas en el foro de Mysql en Foros del Web. Tengo tres tablas: categories @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original CREATE TABLE `categories` (   `idcategorie` INT ( 11 ) NOT NULL AUTO_INCREMENT ,   ...
  #1 (permalink)  
Antiguo 16/04/2014, 03:45
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
DELETE de múltiples entradas en distintas tablas

Tengo tres tablas:

categories

Código SQL:
Ver original
  1. CREATE TABLE `categories` (
  2.  `idcategorie` INT(11) NOT NULL AUTO_INCREMENT,
  3.  `iduser` INT(11) DEFAULT NULL,
  4.  `categorie` VARCHAR(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  5.  PRIMARY KEY (`idcategorie`),
  6.  KEY `iduser_idx` (`iduser`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='categorias principales. esta relacionada con subcategorias.'

subcategories

Código SQL:
Ver original
  1. CREATE TABLE `subcategories` (
  2.  `idsubcategorie` INT(11) NOT NULL AUTO_INCREMENT,
  3.  `idcategorie` INT(11) DEFAULT NULL,
  4.  `subcategorie` VARCHAR(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  5.  PRIMARY KEY (`idsubcategorie`),
  6.  KEY `fk_idcategorie_idx` (`idcategorie`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='sirve para clasificar los posts. subcategorias tiene clave foranea de la clave primaria de posts'

posts

Código SQL:
Ver original
  1. CREATE TABLE `posts` (
  2.  `idpost` INT(11) NOT NULL AUTO_INCREMENT,
  3.  `author` VARCHAR(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  4.  `date_time` datetime DEFAULT NULL,
  5.  `title` VARCHAR(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  6.  `post` mediumtext COLLATE utf8_spanish2_ci,
  7.  `conclusion` mediumtext COLLATE utf8_spanish2_ci,
  8.  `footer` VARCHAR(45) COLLATE utf8_spanish2_ci DEFAULT NULL,
  9.  `idsubcategorie` INT(11) DEFAULT NULL,
  10.  PRIMARY KEY (`idpost`),
  11.  FULLTEXT KEY `post_index` (`post`)
  12. ) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

El problema es que no puedo utilizar ON DELETE CASCADE para poder borrar registros en cascada de manera que pueda mantener la coherencia de los datos en la BD.

El motivo de esto es que posts no es InnoDB, sino MyIsam; esto se debe a que nesito que el campo post tenga FULLTEXT para poder realizar búsquedas profundas en su contenido.

No logro hacer que se borre una categorie junto con las subcategories relacionadas y a la vez los posts relacionados con subcategories.

¿Alguna idea de cómo podría hacer esto? He leído el manual (en inglés y español), he puesto en práctica sus ejemplos, pero no me sirven.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 16/04/2014, 04:22
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: DELETE de múltiples entradas en distintas tablas

Si son tablas MySQM, tendrás que hacer tres DELETEs diferentes, no hay otra forma. Y no te conviene hacerlo por TRIGGERS, por lo que no te aconsejo intentarlo de ese modo.
Lo que yo te sugeriría es que lo hagas todo dentro de un stored procedure, donde puedes hacer cada etapa de validación necesaria para controlar la consistencia de datos.
Es decir, antes de borrar una tabla, recuperas el registro entero. Si falla una de cualquiera de ellas, reinsertas lo recuperado y cancelas la operación.
¿se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/04/2014, 04:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: DELETE de múltiples entradas en distintas tablas

Qual es tu problema la secuencia de querys o encontrar un sistema automatico alternativo?

si es lo segundo creo que no hay....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #4 (permalink)  
Antiguo 16/04/2014, 04:41
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: DELETE de múltiples entradas en distintas tablas

Gracias gnzsoloyo!

Verás, por store procedure no sé cómo se podría hacer, ya que soy muy noob en esto de SQL Y MYSQL.

Yo voy ejecutando consultas según vaya necesitando.

Ante ese panorama, lo que pretendo es borrar de una sola consulta:

categories, a su vez las subcategories cuyo idcategorie foreign key coincida con el idcategorie de categories y a su vez los posts relacionados con la subcategorie.

Lo que me has explicado lo veo genial, pero no sé hacerlo, por ello, si es la solución, entonces tendré que aprender triggers y store procedure, que de todas formas tendría que hacerlo para mejorar mi dominio en SQL y MYSQL.

Aunque intuyo que lo que me has dicho sería para aumentar la seguridad en las consultas ¿no?

muchas gracias!!! :D

quimfv gracias!

mi problema es que no sé cómo podría construir el SQL del query para poder borrar múltiples entradas de múltiples tablas.
__________________
Ayúdame a hacerlo por mi mismo.
  #5 (permalink)  
Antiguo 16/04/2014, 06:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: DELETE de múltiples entradas en distintas tablas

No se puede construir una sola query que haga lo que pides, se podría como bien sabes si dispusiéramos del ON DELETE CASCADE, solo con borrar las categorías se borraría todo lo demás....

La solución del stored, procedimiento almacenado, consiste en que programas una pequeña rutina que ejecute las querys una detrás de la otra para conseguir lo buscado, lo que te propone @gnzsoloyo es que antes de borrar guardes los datos en tablas temporales para poder recuperarlos si una de las querys falla, restaurando así la situación, como si dispusiéramos de TRANSACCIONES.

Se llama "procedimiento almacenado" por que se programa con lenguaje propio del servidor de bases de datos, tienes dos opciones aprender el lenguaje y programar el procedimiento, o usar un lenguaje externo para programar un procedimiento que haga lo mismo solo que no será stored (almacenado).
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #6 (permalink)  
Antiguo 16/04/2014, 06:18
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: DELETE de múltiples entradas en distintas tablas

Sin duda prefiero aprender cómo crear un stored procedure y triggers para hacerlo correctamente, aunque me lleve más tiempo. si puedo evitar hacerlo de forma chapuza, mejor que mejor!! :D

Muchas gracias a ambos por su ayuda!! fue vital y relevante para mi saber esto, porque creía que se podía hacer con una sola consulta.

Saludos!
__________________
Ayúdame a hacerlo por mi mismo.
  #7 (permalink)  
Antiguo 16/04/2014, 07:12
Avatar de 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, 4 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)
  #8 (permalink)  
Antiguo 16/04/2014, 08:55
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: DELETE de múltiples entradas en distintas tablas

WOW! W-O-W!

Para empezar que el primer SQL query que pusistes me funcionó a la primera, tal cual.

Y para terminar

Me dejastes de piedra con semejante SQL :D

En mi vida había visto un SQL tan largo, si eso es un SP entonces creo que tengo para aprender durante un buen rato jajajaja

Simplemente genial gnzsoloyo!!! muchas gracias!!! tomaré como referencia tu SP para aprender algo más rápido, de verdad que me es de mucha ayuda.

Gracias!!! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #9 (permalink)  
Antiguo 16/04/2014, 09:16
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: DELETE de múltiples entradas en distintas tablas

Cita:
En mi vida había visto un SQL tan largo,


¿Largo?
Noooo... El más largo que hice tiene mas o menos unas 580 líneas, y algunas decenas de pasos.
A pesar de que la mayoría piensa que un Sp es para contener una sentencia simple, el sentido de un SP es principalmente hacer secuencias programadas de más de una sentencia como una sola tarea.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 16/04/2014, 09:41
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: DELETE de múltiples entradas en distintas tablas

Pfff, es realmente complejo ya que como dijistes una vez, y no se me olvida, cada acción en MYSQL debe ser revisada con el manual porque cada sintaxis es de una manera muy concreta.

Realmente gracias! :D ahora mismo estoy con un curso de system administrator de red hat, pero en cuanto termine, empezaré de lleno con SP y triggers.

Me encantan las BD en MYSQL :P
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: campo, delete, distintas, entradas, null, registro, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:59.