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

Actualizar los campos de una tabla luego de insertar un registro en la misma

Estas en el tema de Actualizar los campos de una tabla luego de insertar un registro en la misma en el foro de Mysql en Foros del Web. Hola gente, soy nuevo en el foro pero seguidor hace años. Tengo una duda; espero que puedan ayudarme. Sucede que tengo básicamente 3 tablas, las ...
  #1 (permalink)  
Antiguo 12/12/2012, 12:29
 
Fecha de Ingreso: diciembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Actualizar los campos de una tabla luego de insertar un registro en la misma

Hola gente, soy nuevo en el foro pero seguidor hace años. Tengo una duda; espero que puedan ayudarme.

Sucede que tengo básicamente 3 tablas, las cuales son:

Código SQL:
Ver original
  1. CREATE TABLE `padre` (
  2.   `idpadre` INT(255) NOT NULL AUTO_INCREMENT,
  3.   `padre` text COLLATE latin1_spanish_ci NOT NULL,
  4.   `pesoPadre` VARCHAR(45) COLLATE latin1_spanish_ci NOT NULL,
  5.   PRIMARY KEY  (`idpadre`)
  6. )
  7.  
  8. CREATE TABLE `hijo` (
  9.   `idhijo` INT(255) NOT NULL AUTO_INCREMENT,
  10.   `idpadre` INT(255) NOT NULL,
  11.   `hijo` text COLLATE latin1_spanish_ci NOT NULL,
  12.   `pesoHijo` VARCHAR(45) COLLATE latin1_spanish_ci NOT NULL,
  13.   PRIMARY KEY  (`idhijo`)
  14. )
  15.  
  16. CREATE TABLE `nieto` (
  17.   `idnieto` INT(255) NOT NULL AUTO_INCREMENT,
  18.   `idhijo` INT(255) NOT NULL,
  19.   `nieto` text COLLATE latin1_spanish_ci NOT NULL,
  20.   `pesoNieto` VARCHAR(45) COLLATE latin1_spanish_ci NOT NULL,
  21.   PRIMARY KEY  (`idnieto`)
  22. )

El padre es un servicio, el hijo un sub-servicio y el nieto un sub-sub-servicio. Ahora lo que me complica:

Imaginemos que los padres son A, B, C y D. Cada uno cuenta con su 100 en el campo pesoPadre. Pero a su vez existen A.1, A.2, A.3 que son hijos del padre A. Cada uno de estos tres hijos tiene un 33.33 como pesoHijo que hacen el 100 del padre A. Sin embargo existen un nivel mas aún. Que A1 tiene como nieto a A.1.a, A.1.b, A.1.c y A.1.d. Cada uno de estos cuatro nietos tiene un 25.00 como pesoNieto que hacen el 100 del hijo.

Entonces lo que quiero lograr hacer es que la cosa sea modular al momento de agregar un registro por ejemplo en la tabla nieto. Me explico. Si teníamos A.1.a, A.1.b, A.1.c, A.1.d y ahora quiero agregar otro registro que en este caso sería A.1.e el valor de sus campos pesoNieto ya no sería 25.00, sino 20.00 (porque 100/5 da 20).

La consulta cuando agrego un registro nuevo en la tabla nieto por ejemplo sería así:

Código MySQL:
Ver original
  1. SELECT round((100/(count(*)+1)),2) FROM nieto;

Código MySQL:
Ver original
  1. INSERT INTO nieto (idhijo, nieto, pesoNieto) VALUES ('$idHijo[0]', '" . $_POST["nombre1"] . "', '$pesoNieto[0]');
Y no hay problema en agregar el dato que devuelve esa consulta al campo pesoNieto en la tabla nieto. Mi problema es actualizar los otros valores pesoNieto de las distintas filas.

Había pensado en hacerlo con trigger tomando en cuenta que mientras mas bajo nivel mejor, pero no me manejo para nada con los trigger.

Espero que puedan ayudarme y se haya entendido mi problema.

Última edición por gnzsoloyo; 13/12/2012 a las 12:13 Razón: Las normas de los Foros de Base de atos indican que no se deben incluir códigos que no sean SQL.
  #2 (permalink)  
Antiguo 12/12/2012, 13:38
 
Fecha de Ingreso: diciembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Actualizar los campos de una tabla luego de insertar un registro en la mis

Me imagino que luego de insertar de esta forma:

Código MySQL:
Ver original
  1. SELECT round((100/(count(*)+1)),2) FROM nieto;
  2.  
  3. INSERT INTO nieto (idhijo, nieto, pesoNieto)
  4. VALUES ('$idHijo[0]', '" . $_POST["nombre1"] . "', '$pesoNieto[0]');
Podría tener un trigger así, pero no se si está correcto ni tampoco si con eso me lo llenaría para toda la tabla (me imagino que si por el "FOR EACH ROW").

Código MySQL:
Ver original
  1. CREATE TRIGGER modificarPesoNieto
  2. UPDATE pesoNieto SET NEW.pesoNieto;

Y borrando sería utilizando:

Código MySQL:
Ver original
  1. SELECT round((100/(count(*)-1)),2) FROM hijo;

Código MySQL:
Ver original
  1. CREATE TRIGGER modificarPesoNieto
  2. UPDATE pesoNieto SET NEW.pesoNieto;

Última edición por tadie; 12/12/2012 a las 13:51 Razón: Código de programación no permitido en los foros de bases de datos.
  #3 (permalink)  
Antiguo 13/12/2012, 12:06
 
Fecha de Ingreso: diciembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Actualizar los campos de una tabla luego de insertar un registro en la mis

Al final el trigger es el siguiente:

Código SQL:
Ver original
  1. DELIMITER |
  2.  
  3. CREATE TRIGGER modificarPesoHijo AFTER INSERT ON hijo
  4. FOR EACH ROW
  5. BEGIN
  6.     UPDATE hijo SET pesoHijo = NEW.pesoHijo;
  7. END
  8.  
  9. |
  10. DELIMITER ;

Sin embargo parece que no se puede actualizar la misma tabla que invoco el trigger, por lo que creo que debería hacerse con procedimiento almacenado.

Veré si puedo lograr lo que quiero y lo posteo para que sirva de futura ayuda para quien la necesite.

Si alguien me puede hechar una mano le agradecería.
  #4 (permalink)  
Antiguo 17/12/2012, 11:29
 
Fecha de Ingreso: diciembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Actualizar los campos de una tabla luego de insertar un registro en la mis

Había olvidado comentar que finalmente pude lograr lo que quería, el procedimiento almacenado para agregar padres es:

Código SQL:
Ver original
  1. DELIMITER |
  2.  
  3. CREATE PROCEDURE agregarComponente (
  4.   IN padre      TEXT,
  5.   IN pesoPadre  VARCHAR(45)
  6. )
  7.  
  8. BEGIN
  9.   INSERT INTO padre (padre, pesoPadre) VALUES (padre, pesoPadre);
  10.   UPDATE padre SET pesoPadre = pesoPadre;
  11. END
  12.  
  13. |
  14. DELIMITER ;

Y similar para eliminar.

Saludos y gracias de todos modos, aunque no tuve ayuda.

Etiquetas: campos, registro, 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 06:24.