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

Trigger para sumar 1 después de insertar

Estas en el tema de Trigger para sumar 1 después de insertar en el foro de Mysql en Foros del Web. Hola a todos: Pues esto de los triggers nunca ha sido lo mío, así que a ver si alguien me ilumina. No es tan complicado, ...
  #1 (permalink)  
Antiguo 08/06/2009, 08:01
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Pregunta Trigger para sumar 1 después de insertar

Hola a todos:
Pues esto de los triggers nunca ha sido lo mío, así que a ver si alguien me ilumina. No es tan complicado, pero dudo de si lo que estoy haciendo se puede...
Os comento: tengo dos tablas habitaciones y alojamientos. Quiero que cada vez que se inserte una habitación nueva (con la clave ajena de ese alojamiento); al alojamiento se le sume la habitación.
ALOJAMIENTOS: identificador,Nombre, dir, tfno... Simple, Doble. (estas son las columnas de Alojamientos.
HABITACIONES: numero,Tipo, idHotel... (y las columnas de Habitaciones).

Yo lo que pretendía hacer es:

CREATE TRIGGER sumahabitacion
AFTER INSERT ON habitaciones
UPDATE alojamientos
SET habitaciones.Tipo=habitaciones.Tipo+1
WHERE habitaciones.idHotel=alojamientos.identificador.

Fijaos en el SET. Me parece que estoy confundiendo las cosas. ¿Eso se puede hacer? Lo que le estoy diciendo es que actualice la columna de habitaciones Dobles o Habitaciones simples, según el tipo de habitación que se inserte, pero me parece que así no voy bien.

Perdón por el ladrillo. ¿Alguien me tira una manita?

MUCHAS GRACIAS.
  #2 (permalink)  
Antiguo 08/06/2009, 08:09
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Trigger para sumar 1 después de insertar

2 Cosas.

dices habitaciones.tipo y entiendo que es un campo llamado tipo de la tabla habitaciones. Si es así, por que estas haciendo el update a la tabla alojamientos?

Si quieres utilizar el valor que se acaba de insertar en la tabla habitaciones, debe ser con new.tipo.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 08/06/2009, 08:20
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Cita:
Iniciado por huesos52 Ver Mensaje
2 Cosas.

dices habitaciones.tipo y entiendo que es un campo llamado tipo de la tabla habitaciones. Si es así, por que estas haciendo el update a la tabla alojamientos?

Si quieres utilizar el valor que se acaba de insertar en la tabla habitaciones, debe ser con new.tipo.

Un saludo.
A eso me refería, que supongo que no lo estoy haciendo bien. Pero lo que trato de hacer es que incremente en una columna u otra de la tabla alojamientos. Y no se cómo decirle eso. ¿Me explico? Si tengo dos columnas en ALOJAMIENTOS: Simples y Dobles. Y quiero que según el tipo de habitación que se haya insertado, se incremente una u otra (por cierto, gracias por lo de New.tipo), no sé cómo decirle a alojamientos qué columna tiene que incrementar en 1. Por eso decía lo de "SET habitaciones.tipo"...
  #4 (permalink)  
Antiguo 08/06/2009, 08:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Trigger para sumar 1 después de insertar

Por que no pones la estructura de las tablas alojamientos y habitaciones?

Mediante que campos estan relacionadas?

Si te entiendo puedes hacer una pregunrta en el trigger.

if new.tipo = 'simple' then
alojamientos.simples = alojamientos.simples + 1;
else
alojamientos.dobles = alojamientos.dobles + 1;


Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 08/06/2009, 08:38
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Cita:
Iniciado por huesos52 Ver Mensaje
Por que no pones la estructura de las tablas alojamientos y habitaciones?

Mediante que campos estan relacionadas?

Si te entiendo puedes hacer una pregunrta en el trigger.

if new.tipo = 'simple' then
alojamientos.simples = alojamientos.simples + 1;
else
alojamientos.dobles = alojamientos.dobles + 1;


Un saludo.
Muchas gracias huesos52, hace tiempo que estudié lo de los TRIGGERS y sinceramente no sabía que podía meter if/else en ellos.

ALOJAMIENTOS:
Nombre varchar(45)
Direccion varchar(45)
Ciudad varchar(30)
Tfno varchar(15)
Doble int(15)
Simple int(15)
Tipo varchar(20)
identificador int(15)
HABITACIONES:
idHotel int(15)
numero int(15)
Tipo varchar(7)
Precio decimal(10,0)

idHotel de Habitaciones es la clave ajena a Alojamientos (identificador).

Voy a probarlo con tu respuesta, porque SET alojamientos.Simples... es muchísimo más lógico que lo de SET habitaciones.tipo... Sabía que estaba haciendo una locura, pero no sabía cómo remediarla. Jaja. GRACIAS, otra vez.
  #6 (permalink)  
Antiguo 08/06/2009, 09:10
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Hola otra vez:
Veis algo mal en la sintaxis?

CREATTE TRIGGER sumahabitacion
AFTER INSERT ON habitaciones
FOR EACH ROW BEGIN
IF NEW.Tipo='Simple'
THEN UPDATE alojamientos
SET Simples=Simples+1 WHERE NEW.idHotel=alojamientos.identificador;
ELSE UPDATE alojamientos
SET Dobles=Dobles+1 WHERE NEW.idHotel=alojamientos.identificador;
END IF;
END;

Gracias. un saludo!!
  #7 (permalink)  
Antiguo 08/06/2009, 09:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Trigger para sumar 1 después de insertar

Si veo errores tucky5

Estas llamando como campo new.idhotel en la tabla alojamientos que no veo que exista el campo.

La comparación creo que sería al reves.
WHERE identificador = NEW.idHotel;

Te recomiendo para operaciones matematicas, utilizar parentesis. (Por cuestión de orden)

Recuerda hacer uso de los delimitadores para que el trigger se genere correctamente.

delimiter &&

trigger

end&&

delimiter ;


Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 08/06/2009, 11:01
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Me dice que tengo un error de sintaxis, habiendo puesto los paréntesis y todo lo que me has recomendado.
  #9 (permalink)  
Antiguo 08/06/2009, 12:14
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Trigger para sumar 1 después de insertar

Donde te señala el error de sintaxis?
Que aparece despues de near..??

Pusiste los delimiters??

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 09/06/2009, 02:16
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '&&
CREATE TRIGGER sumahabitacion
AFTER INSERT ON habitaciones
FOR EACH ROW
' at line 3

Sí, puse los delimitadores:
DELIMITER&&
CREATE TRIGGER sumahabitacion
AFTER INSERT ON habitaciones
FOR EACH ROW
BEGIN
if NEW.Tipo='Simple'
THEN UPDATE alojamientos
SET Simples=(Simples+1) WHERE identificador=NEW.idHotel;
else UPDATE alojamientos
SET Dobles=(Dobles+1) WHERE identificador NEW.idHotel;
END if;
END&&
DELIMITER;

Y si le quito los delimitadores, me da otro error:
Can't create a TRIGGER from within another stored routine

Última edición por Tucky5; 09/06/2009 a las 02:21
  #11 (permalink)  
Antiguo 09/06/2009, 06:38
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Trigger para sumar 1 después de insertar

Sospecho que lo corres desde phpmyadmin.

Misteriosamente, los triggers ni funciones, corren adecuadamente en esta herramienta. Ya probaste corriendo el trigger directamente en la consola?

Otro detalle que veo es que te falta un igual en el where del update del else.


Pruebalo y nos cuentas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 09/06/2009, 07:29
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Cita:
Iniciado por huesos52 Ver Mensaje
Sospecho que lo corres desde phpmyadmin.

Misteriosamente, los triggers ni funciones, corren adecuadamente en esta herramienta. Ya probaste corriendo el trigger directamente en la consola?

Otro detalle que veo es que te falta un igual en el where del update del else.


Pruebalo y nos cuentas.
Lo estoy haciendo desde el Visual Studio. Pero desde la consola tampoco me funcionan. Lo del = en el UPDATE es que se me ha pasado a mí al copiarlo aquí. Pero allí lo tengo bien.
  #13 (permalink)  
Antiguo 09/06/2009, 08:02
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 sumar 1 después de insertar

Cita:
Can't create a TRIGGER from within another stored routine
Parece estar diciendo que estuviesen tratando de crear un TRGGER desde adentro de un STORED PROCEDURE.
¿Es así?

Además de esto, los nombres de los campos deben tratarse SIEMPRE con las pseudovariables NEW y OLD, de lo contrario no los podrá encontrar.
Esto:
Cita:
SET Simples=(Simples+1)
debería en todo caso escribirse:
Cita:
SET OLD.Simples=(OLD.Simples+1)
Sino, va a buscar una variable llamada SIMPLE y no está declarada... Al menos según lo que he realizado en TRIGGERS es lo que he visto pasar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 10/06/2009, 04:12
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Parece estar diciendo que estuviesen tratando de crear un TRGGER desde adentro de un STORED PROCEDURE.
¿Es así?
Pues no se si es así. ¿Qué es un Stored procedure exáctamente? Yo creo que no, pero bueno, algo debo de hacer mal, cuando en todos los triggers que hago me dice eso.
  #15 (permalink)  
Antiguo 24/06/2009, 05:44
 
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Trigger para sumar 1 después de insertar

Al final he encontrado el fallo. Y lo dejo aquí por si a alguien más (despistado como yo) le pasa.
El Visual Studio, al decirle que quieres crear el trigger, automáticamente te hace el encabezado: "create trigger...." Nosotros sólo debemos de poner a partir de BEGIN.
Yo no lo sabía, y creaba el trigger como lo habia hecho siempre.
Un saludo!!
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 17:26.