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

[SOLUCIONADO] Trigger para insertar

Estas en el tema de Trigger para insertar en el foro de Mysql en Foros del Web. Hola, soy nuevo en este foro pero constantemente lo visito y ahora al tener un problema decidí registrarme . Les cuento, mir problema es el ...
  #1 (permalink)  
Antiguo 14/02/2013, 12:08
Avatar de rey_sant  
Fecha de Ingreso: febrero-2013
Ubicación: Chile
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Pregunta Trigger para insertar

Hola, soy nuevo en este foro pero constantemente lo visito y ahora al tener un problema decidí registrarme .
Les cuento, mir problema es el siguiente:
tengo 3 tablas que son usuario
Código:
DROP TABLE IF EXISTS pru.usuario;
CREATE TABLE `usuario` (
  `id_usuario` int(11) NOT NULL AUTO_INCREMENT,
  `nombre_usuario` varchar(50) NOT NULL,
  `apellido_usuario` varchar(50) NOT NULL,
  PRIMARY KEY (`id_usuario`)
)
libro
Código:
DROP TABLE IF EXISTS pru.libro;
CREATE TABLE `libro` (
  `id_libro` int(11) NOT NULL AUTO_INCREMENT,
  `nombre_libro` varchar(50) NOT NULL,
  `stock_libro` int(11) NOT NULL,
  PRIMARY KEY (`id_libro`)
)
y prestamo
Código:
DROP TABLE IF EXISTS pru.prestamo;
CREATE TABLE `prestamo` (
  `id_prestamo` int(11) NOT NULL AUTO_INCREMENT,
  `id_usuario` int(11) NOT NULL,
  `id_libro` int(11) NOT NULL,
  `cantidad_prestamo` int(11) NOT NULL,
  PRIMARY KEY (`id_prestamo`),
  KEY `id_libro` (`id_libro`),
  KEY `id_usuario` (`id_usuario`)
)
el problema es que quiero crear un trigger que automáticamente descuente el campo stock_libro de la tabla libro lo he intentado pero recién estoy aprendiendo la sintaxis, lo que tengo es esto
trigger
Código:
DELIMITER $$
CREATE TRIGGER disp AFTER INSERT ON prestamo FOR EACH ROW
begin 
      SET @stock = stock_libro-NEW.cantidad_prestamo;
      

end $$

DELIMITER
espero me puedan ayudar, se los agradecería muchísimo
  #2 (permalink)  
Antiguo 14/02/2013, 14:20
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Trigger para insertar

Dentro de tu trigger tendrias que consultar por el stock_libro relacionado al nuevo prestamo generado. Algo así:

Código MySQL:
Ver original
  1. SELECT (stock_libro - NEW.cantidad_prestamo) INTO @stock
  2. FROM libro li
  3. INNER JOIN prestamo pre ON pre.id_libro = li.id_libro
  4. WHERE id_prestamo = NEW.id_prestamo

Y luego al final usas @stock para actualizar donde deseas. Saludos.
__________________
Quitenme la vida pero no la bebida.
  #3 (permalink)  
Antiguo 14/02/2013, 21:13
Avatar de rey_sant  
Fecha de Ingreso: febrero-2013
Ubicación: Chile
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Trigger para insertar

Este mismo ejercicio lo realice en mssql con el siguiente trigger
Código:
create trigger actualiza_stock
  on prestamo
  for insert
  as
   declare @stock int
   select @stock= stock from libro, prestamo
   where libro.id_libro=prestamo.id_libro
   update libro set stock=stock-prestamo.cantida
	from libro, prestamo
     where prestamo.id_libro=libro.id_libro
y quiero hacerlo en mysql, la respuesta de arriba no me sirvio :/
  #4 (permalink)  
Antiguo 15/02/2013, 04:04
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 12 años, 10 meses
Puntos: 42
Respuesta: Trigger para insertar

Hola rey_sant,

Te dejo un ejemplo en sqlfiddle.com que te puede ser útil.

Avísame si tienes dudas.
  #5 (permalink)  
Antiguo 15/02/2013, 22:07
Avatar de rey_sant  
Fecha de Ingreso: febrero-2013
Ubicación: Chile
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Trigger para insertar

Cita:
Iniciado por wchiquito Ver Mensaje
Hola rey_sant,

Te dejo un ejemplo en [URL="http://sqlfiddle.com/#!2/434bc/1"]sqlfiddle.com[/URL] que te puede ser útil.

Avísame si tienes dudas.
Gracias eso era justamente lo que necesitaba :) si no fuera mucha molestia me podrías recomendar un buen libro referente a mysql
  #6 (permalink)  
Antiguo 16/02/2013, 05:26
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, 5 meses
Puntos: 2658
Respuesta: Trigger para insertar

Cita:
Iniciado por wchiquito Ver Mensaje
Hola rey_sant,

Te dejo un ejemplo en sqlfiddle.com que te puede ser útil.

Avísame si tienes dudas.
Para mejor entendimiento del resto de los foristas, esta es la solución propuesta por @wchiquito:

Estructura de datos:
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `libro`//
  2.  
  3. CREATE TABLE `libro` (
  4.   `id_libro` int(11) NOT NULL AUTO_INCREMENT,
  5.   `nombre_libro` varchar(50) NOT NULL,
  6.   `stock_libro` int(11) NOT NULL,
  7.   PRIMARY KEY (`id_libro`)
  8. )//
  9.  
  10. /*Data for the table `libro` */
  11.  
  12. insert  into `libro`(`nombre_libro`,`stock_libro`) values ('Libro 1',20)//
  13.  
  14. /*Table structure for table `prestamo` */
  15.  
  16. DROP TABLE IF EXISTS `prestamo`//
  17.  
  18. CREATE TABLE `prestamo` (
  19.   `id_prestamo` int(11) NOT NULL AUTO_INCREMENT,
  20.   `id_usuario` int(11) NOT NULL,
  21.   `id_libro` int(11) NOT NULL,
  22.   `cantidad_prestamo` int(11) NOT NULL,
  23.   PRIMARY KEY (`id_prestamo`),
  24.   KEY `id_libro` (`id_libro`),
  25.   KEY `id_usuario` (`id_usuario`)
  26. )//
  27.  
  28. /*Table structure for table `usuario` */
  29.  
  30. DROP TABLE IF EXISTS `usuario`//
  31.  
  32. CREATE TABLE `usuario` (
  33.   `id_usuario` int(11) NOT NULL AUTO_INCREMENT,
  34.   `nombre_usuario` varchar(50) NOT NULL,
  35.   `apellido_usuario` varchar(50) NOT NULL,
  36.   PRIMARY KEY (`id_usuario`)
  37. )//
  38.  
  39. /*Data for the table `usuario` */
  40.  
  41. insert  into `usuario`(`nombre_usuario`,`apellido_usuario`) values ('Nombre 1','Apellido 1')//
  42.  
  43. /* Trigger structure for table `prestamo` */
  44.  
  45. /*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `actualiza_stock` *///
  46.  
  47. /*!50003 CREATE TRIGGER `actualiza_stock` AFTER INSERT ON `prestamo` FOR EACH ROW BEGIN
  48.     UPDATE libro SET stock_libro = stock_libro - new.cantidad_prestamo
  49.     WHERE libro.id_libro = new.id_libro;
  50. END *///
  51.  
  52. INSERT INTO `prestamo` (`id_usuario`, `id_libro`, `cantidad_prestamo`) VALUES (1, 1, 3);

Verificacion:
Código MySQL:
Ver original
  1. SELECT * FROM `usuario`;
  2. SELECT * FROM `libro`;
  3. SELECT * FROM `prestamo`;

Es conveniente que las soluciones sean posteadas directamente en el foro, y no colocadas en otros sites. Es parte del sentido de FDW.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 18/02/2013, 03:21
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 12 años, 10 meses
Puntos: 42
Respuesta: Trigger para insertar

Hola rey_sant,

En cuanto a libros depende el área que necesites, por ejemplo tienes:

Espero te sean de utilidad.
  #8 (permalink)  
Antiguo 18/02/2013, 03:29
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 12 años, 10 meses
Puntos: 42
Respuesta: Trigger para insertar

Hola gnzsoloyo,

En cuanto a las soluciones, ejemplos o código en general, considero que usar recursos externos (que están a un clic de distancia) donde se pueda ver, editar y ejecutar código es de mayor provecho para todos, sin que con esto se pierda el sentido de FDW.

En en caso concreto de los foros de base de datos, sería interesante integrar un servicio como sqlfiddle.com (como herramienta de apoyo), tanto en los posts de preguntas como de respuestas, con el fin de facilitar la comprensión tanto de quienes preguntamos o de quienes respondemos.

Es una idea que propongo, siempre con la finalidad de mejorar FDW, el cual es un gran recurso.

Etiquetas: insert, tabla, trigger
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:50.