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

Crear un procedimiento almacenado

Estas en el tema de Crear un procedimiento almacenado en el foro de Mysql en Foros del Web. Buenas a todos, necesito crear un procedimiento almacenado para borrar registros. De forma que voy a tener una tabla que almacenará unas ids a borrar. ...
  #1 (permalink)  
Antiguo 09/02/2016, 06:26
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 16 años, 6 meses
Puntos: 2
Crear un procedimiento almacenado

Buenas a todos, necesito crear un procedimiento almacenado para borrar registros. De forma que voy a tener una tabla que almacenará unas ids a borrar. Lo que no tengo nada claro es como leer todos esos ids para borrar, es decir, en el procedure haría algo como esto:
select ids from tablaBorrar y el resultado de esos ids tendría que almacenarlos en alguna variable tipo array para hacer luego un bucle for o while e ir borrandolo.
Pero no tengo ni idea de como realizar esto con procedures, lo tengo hecho en php pero al ser montones de registros a borrar (millones) se pasa el tiempo permitido por el servidor, es decir que aparte de tardar mucho le haría esperar al usuario todo ese tiempo para terminar dando un error tipo tiempo de espera agotado, por eso hacer el procedure, para lanzarlo cundo lo necesite y vea que la bd no está en uso.

¿ Alguien tiene idea o algún ejemplo de como se haría ?
  #2 (permalink)  
Antiguo 09/02/2016, 06:42
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 6 meses
Puntos: 15
Respuesta: Crear un procedimiento almacenado

Tendrás 2 tablas?? una con registros a borrar y otra con todos los registros incluido los que borraras??
  #3 (permalink)  
Antiguo 09/02/2016, 08:20
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: Crear un procedimiento almacenado

Nop, tengo una tabla con ids a borrar. Con esas ids borro de una tabla, pero aparte tengo que realizar una select con joins de otras tablas para sacar otras ids a borrar diferentes, es decir por medio de una id soy capaz de sacar 2 ids de diferentes tablas que estan relacionadas. Borrando de registros de 3 tablas al final.
¿ Es posible que pudiera hacer un simple delete en el procedure con joins para borrar 3 tablas de golpe ?.
La relación sería algo así: tabla plataformas: id_plataforma se relaciona con Tabla licencias id_plataforma - La tabla licencias relaciona el campo id_licencia con la tabla dipatch id_licencia y la tabla dispatch usa el campo id_dispatch para relacionarse con la tabla scormvars del campo id_dispatch.
Podría hacer un delete con esos joins que borren de las 4 tabls por medio de un id ?, tipo delete tabla1,2,3,4 y sus joins ?, y lanzar el procedure cuando vea que la bd no está con mucho uso ?

Última edición por arts; 09/02/2016 a las 08:29
  #4 (permalink)  
Antiguo 09/02/2016, 12:24
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 6 meses
Puntos: 15
Respuesta: Crear un procedimiento almacenado

Claramente puedes, me cuesta un poco entender la relación y de donde quieres eliminar los datos, pero el procedimiento puede ejecutar sentencias de forma secuencial... puedes crear un delete de una tabla y cuando termine sigues con el delete de la siguiente tabla
  #5 (permalink)  
Antiguo 10/02/2016, 02:06
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: Crear un procedimiento almacenado

A ver que os parece la solución que he sacado:
1º Voy a tener una serie de ids en una tabla temporal que será de donde iré borrando los datos con el procedure.
De forma que voy a realizar una select con todos esos ids a borrar que me van a sacar otros ids diferentes donde creare una tabla para ellos y luego con esos datos obtenidos creo que solo tengo que borrarlos sin más haciendo un delete de esos campos que he sacado.

create temporary table idsToDelete
select
distinct l.ID_plataforma as plataforma,
s.ID_dispatch as dispatch,
l.ID_licencia as licencia
from scormvars s
left join dispatch d on s.ID_dispatch = d.ID_dispatch
left join licencias l on d.ID_licencia = l.ID_licencia
where l.ID_plataforma in (select idPlataforma from borrarplataformas);

delete from dispatch where ID_dispatch in (select dispatch from idsToDelete);
delete from licencias where ID_licencia in (select licencia from licencia);
  #6 (permalink)  
Antiguo 10/02/2016, 06:05
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 6 meses
Puntos: 15
Respuesta: Crear un procedimiento almacenado

Eso sirve, pero te recomendaría más usar un JOIN por ID en vez de el select IN de los delete si es posible, ya que cuando son cientos de miles o millones de datos esos IN pesan bastante en tiempos.


Ahora quedaría comprobar si el select trae efectivamente todo los ID que deseas borrar

Etiquetas: almacenado, procedimiento, registros, select, tabla
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 13:30.