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

trigger truncate, vista parámetro

Estas en el tema de trigger truncate, vista parámetro en el foro de Mysql en Foros del Web. Amigos, me encuentro en la situación siguiente: tengo una tabla de la que tengo que sacar mediante consulta y ordenados los registros cuyo FKStatus = ...
  #1 (permalink)  
Antiguo 24/11/2013, 06:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
trigger truncate, vista parámetro

Amigos,
me encuentro en la situación siguiente:
tengo una tabla de la que tengo que sacar mediante consulta y ordenados los registros cuyo FKStatus = 5 y guardarlos en otra tabla para trabajar sobre ellos, pero necesito tener un número de orden por orden alfabético. Y eso debe hacerlo dinámicamente, es decir, cada vez que cambie ese valor en actualización, o se borre el registro o se actualice el registro con ese valor.
la consulta es fácil:
Código MySQL:
Ver original
  1. SELECT PKlema, lema FROM lemas_lemas WHERE FKStatus = 5 ORDER BY lema
Necesito crear una tabla con esos datos o una vista donde cargar numerados esos registros y recorrerlos luego con facilidad (ahora hay sobre unas centenas, pero más adelante habrá miles), y no es lo mismo tener que ordenar y numerar 30000 registros o más en el futuro, que hacerlo sobre los que ahora tienen ese FKStatus y que ya tengan su número. El recorrido con la programación y también la búsqueda serán más eficientes.
Pues bien, si creo la tabla con los campos y cada vez que se añade o se borra un FKStatus = 5 quiero hacer TRUNCATE y luego INSERTAR los datos de un SELECT mediante un trigger, me encuentro con que los triggers no permiten usar TRUNCATE (lo que me facilitaría un autoincrementable), porque es DDL, y luego realizar el INSERT... FROM SELECT...
Si creo una vista con la consulta para luego volver a consultarla, me doy cuenta de que las vistas no permiten pasar parámetros para hacer la numeración necesaria. Me devuelve error al intentarlo.
Con un procedimiento almacenado puedo hacerlo, claro, pero tengo que llamarlo cada vez que cambie el dato al insertar o borrar, y me gustaría no tener que llamarlo en todos los lugares de programación donde se inserte, se actualice o se borre algo (aunque si los trigger pudieran, tendría que crear uno para cada caso), pero me temo que será lo que tenga que hacer o resolverlo en programación.
Tal vez se os ocurra algo sobre los trigger o vistas que pueda ayudar, o creéis que hay que hacerlo necesariamente con un procedimiento almacenado o con programación.
He probado la vista y el trigger, y luego visitado la red para ver cuál era el problema real.

Espero haberme explicado bien. Naturalmente, solo estoy pidiendo orientación para hacerlo con funcionalidades y herramientas propias de la base de datos.
Gracias.

Última edición por jurena; 24/11/2013 a las 09:25
  #2 (permalink)  
Antiguo 10/12/2013, 00:07
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: trigger truncate, vista parámetro

Hola, (quizas ya lo solucionaste), se me ocurren una alternativa distinta a las propuestas.

Porque no en la tabla "lemas_lemas" agregas una columna que sea "orden_aux", luego en los trigger after [insert/update/delete] pones un codigo como este:

Código MySQL:
Ver original
  1. UPDATE lemas_lemas INNER JOIN (SELECT (@rownum:=(if(@fkant=FKStatus, @rownum+1, 0))) orden_aux, (@fkant:=FKStatus) orden_ant, PKlema
  2. FROM lemas_lemas , (SELECT @rownum:=0, @fkant:=0) aux ORDER BY FKStatus, lema ASC) tmp ON lemas_lemas.PKlema = tmp.PKlema SET lemas_lemas.orden_aux = tmp.orden_aux

En el campo orden_aux tendras entonces un campo ordenado para cada estado de la FKStatus según lema ASC

Si no te alcanza teniedo este campo puedes crear las vistas que necesites ya que no nesesitaras usar parametros ni variables, solo te referenciaras a orden_aux.

asi como puse la sentencia te sirve para cualquier FKStatus, si quieres que solo sea para el caso articular de 5 quedaria asi:

Código MySQL:
Ver original
  1. UPDATE lemas_lemas INNER JOIN (SELECT (@rownum:=(if(@fkant=FKStatus, @rownum+1, 0))) orden_aux, (@fkant:=FKStatus) orden_ant, PKlema
  2. FROM lemas_lemas , (SELECT @rownum:=0, @fkant:=0) aux ORDER BY lema ASC WHERE FKStatus = 5) tmp ON lemas_lemas.PKlema = tmp.PKlema SET lemas_lemas.orden_aux = tmp.orden_aux

saludos
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 10/12/2013, 05:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: trigger truncate, vista parámetro

Gracias, NSD,
no lo hemos resuelto todavía, porque pensamos hacerlo con programación. Lo veremos y te diré, pero la idea en principio me parece buena, uno o dos campos que se actualizan con trigger, y luego una o dos vistas para usar en los selectores. Eso haría innecesaria esa otra tabla.
Lo probaremos y si funciona, marcaré el tema como solucionado.
Muchas gracias.

Última edición por jurena; 10/12/2013 a las 05:28

Etiquetas: campo, registro, select, tabla, trigger, vista
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 14:10.