trigger

Iniciado por basickdagger, 8 Marzo 2013, 18:45 PM

0 Miembros y 1 Visitante están viendo este tema.

basickdagger

como podria hacer un trigger, para un update q en una tabla me modifique de 0 a 1


por ejemplo tengo

[id]  [nombre]    [valor]
  1    lunes            0
  2    martes          0
  3    miercoles     1


y si doy un update a valor colocando un 1 en lunes, en miercoles cambie a 0

cassiani

quieres que todos los demas campos cambien a cero o solo ese en especifico?
Haz un update dentro del disparador que actualice todo a cero, menos el registro recien actualizado.

algo como:
Código (sql) [Seleccionar]
CREATE TRIGGER mi_tgr
BEFORE UPDATE ON mi_tabla
FOR EACH ROW
UPDATE mi_tabla SET valor=0 WHERE id<>OLD.id;


guiate de ahí.

basickdagger

Cita de: cassiani en  8 Marzo 2013, 22:37 PM
quieres que todos los demas campos cambien a cero o solo ese en especifico?
Haz un update dentro del disparador que actualice todo a cero, menos el registro recien actualizado.

algo como:
Código (sql) [Seleccionar]
CREATE TRIGGER mi_tgr
BEFORE UPDATE ON mi_tabla
FOR EACH ROW
UPDATE mi_tabla SET valor=0 WHERE id<>OLD.id;


guiate de ahí.

si quiero q todos se pongan en cero excepto el q puse en 1

disculpa mi ignorancia pero en esta parte id<>OLD.id  q viene siendo OLD?

Carloswaldo

OLD contiene el valor antiguo del registro (el que tiene antes del update) aunque en este caso creo que también se debería incluir en la función del trigger algo que valide que se está cambiando el valor a 1 (el ejemplo de cassiani está bien, pero también se ejecutaría cuando se haga un UPDATE mi_tabla SET valor=0, lo cual no sería un problema en una tabla pequeña, pero si es grande se consumiría recursos innecesariamente en el FOR EACH), agregando un IF NEW.valor = 1 sería suficiente.

Yo lo haría así:

Código (sql) [Seleccionar]
CREATE TRIGGER mi_tgr
BEFORE UPDATE ON mi_tabla
IF NEW.valor=1 THEN
UPDATE mi_tgr SET valor = 0;
END IF;


Tambíen se podría agregar AND OLD.valor=0 en el IF como validación adicional asumiendo que esta validación no se hace en la aplicación.

;D

basickdagger

gracias por su ayuda, una ultima cosa si quisiera agregar una condicion mas por ejemplo un where tipo = "Xcosa" seria asi...???



CREATE TRIGGER mi_tgr
BEFORE UPDATE ON mi_tabla
IF NEW.valor=1 THEN
UPDATE mi_tgr SET valor = 0 where tipo = "Xcosa";
END IF;


por ejemplo en una tabla quiero q si actualize a 1, los demas se pongan en ceros siempre y cuando en el atributo tipo diga "Xcosa"; estaria bn asi la sintaxis del trigger? ademas queria saber si es mas rapido la ejecucion de un trigger o un procedure??


Carloswaldo

Hola

Sí, la condición que has agregado en el código está bien para lo que quieres hacer. Por otro lado, un trigger no es lo mismo que un procedure, te recomiendo que investigues sobre su diferencia, no es que uno sea más rápido que el otro sino que se usan para distintos propósitos.

basickdagger

gracias por la respuesta pero me salio un error...


#1064 - 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 'IF NEW.fav=1 THEN
    UPDATE anuncio SET fav= 0;
END IF' at line 3

este es mi script



CREATE TRIGGER disp
BEFORE UPDATE ON anuncio
IF NEW.fav=1 THEN
UPDATE anuncio SET fav= 0;
END IF;




mi tabla se llama anuncio y tiene un atributo integer not null llamado fav
q estoy haciendo mal??
tambien intente hacerlo con la herramienta de phpMyAdmin pero al modificar me arroja un error le doy click y no sale nada pero tampoco modifica nada...




Carloswaldo

Ah, me he confundido un poco (en realidad mucho xD), pensé que en MySQL también había algo como FOR EACH STATEMENT, tampoco tenía MySQL instalado para probar. Debería ser así:

Código (sql) [Seleccionar]
DELIMITER $$
CREATE TRIGGER disp BEFORE UPDATE ON anuncio
FOR EACH ROW BEGIN
IF NEW.fav=1 THEN
UPDATE anuncio SET fav= 0;
END IF;
END $$
DELIMITER ;


PERO

#1442 - Can't update table 'anuncio' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Pues

CitarB.5.9: Can triggers access tables?

A trigger can access both old and new data in its own table. A trigger can also affect other tables, but it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

http://dev.mysql.com/doc/refman/5.5/en/faqs-triggers.html#qandaitem-B-5-1-9

Así que para este caso creo que no podrás usar un trigger, tal vez deberías usar un store procedure y en vez de hacer UPDATE directamente en la tabla llamarías al procedure, algo como update_anuncio(int id, int estado)

basickdagger

hehe muchas gracias a eso me referia con lo de cual seria mas rapido, probare hacer un procedure y comento si me funciono gracias por tomarte el tiempo en ayudarme  ;)