elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  trigger
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: trigger  (Leído 7,031 veces)
basickdagger


Desconectado Desconectado

Mensajes: 650


System.out.println("this is weird as fuck");


Ver Perfil
trigger
« en: 8 Marzo 2013, 18:45 pm »

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


En línea

cassiani


Desconectado Desconectado

Mensajes: 978


« Anterior | Próximo »


Ver Perfil WWW
Re: trigger
« Respuesta #1 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
  1. CREATE TRIGGER mi_tgr
  2. BEFORE UPDATE ON mi_tabla
  3. FOR EACH ROW
  4. UPDATE mi_tabla SET valor=0 WHERE id<>OLD.id;

guiate de ahí.


En línea

basickdagger


Desconectado Desconectado

Mensajes: 650


System.out.println("this is weird as fuck");


Ver Perfil
Re: trigger
« Respuesta #2 en: 9 Marzo 2013, 00:48 am »

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
  1. CREATE TRIGGER mi_tgr
  2. BEFORE UPDATE ON mi_tabla
  3. FOR EACH ROW
  4. 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?
En línea

Carloswaldo
Traductor
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.764


Nos reservamos el derecho de ban.


Ver Perfil WWW
Re: trigger
« Respuesta #3 en: 11 Marzo 2013, 05:23 am »

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
  1. CREATE TRIGGER mi_tgr
  2. BEFORE UPDATE ON mi_tabla
  3. IF NEW.valor=1 THEN
  4. UPDATE mi_tgr SET valor = 0;
  5. END IF;
  6.  

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
En línea





Dominio en venta: https://forojapones.com/
basickdagger


Desconectado Desconectado

Mensajes: 650


System.out.println("this is weird as fuck");


Ver Perfil
Re: trigger
« Respuesta #4 en: 11 Marzo 2013, 18:34 pm »

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

Código:

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??

En línea

Carloswaldo
Traductor
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.764


Nos reservamos el derecho de ban.


Ver Perfil WWW
Re: trigger
« Respuesta #5 en: 11 Marzo 2013, 19:41 pm »

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.
En línea





Dominio en venta: https://forojapones.com/
basickdagger


Desconectado Desconectado

Mensajes: 650


System.out.println("this is weird as fuck");


Ver Perfil
Re: trigger
« Respuesta #6 en: 11 Marzo 2013, 20:55 pm »

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

Código:

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...



En línea

Carloswaldo
Traductor
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.764


Nos reservamos el derecho de ban.


Ver Perfil WWW
Re: trigger
« Respuesta #7 en: 11 Marzo 2013, 22:32 pm »

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
  1. DELIMITER $$
  2. CREATE TRIGGER disp BEFORE UPDATE ON anuncio
  3. FOR EACH ROW BEGIN
  4. IF NEW.fav=1 THEN
  5. UPDATE anuncio SET fav= 0;
  6. END IF;
  7. END $$
  8. DELIMITER ;

PERO

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

Pues

Citar
B.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)
En línea





Dominio en venta: https://forojapones.com/
basickdagger


Desconectado Desconectado

Mensajes: 650


System.out.println("this is weird as fuck");


Ver Perfil
Re: trigger
« Respuesta #8 en: 12 Marzo 2013, 07:32 am »

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  ;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con trigger
Programación Visual Basic
Webagent007 1 1,844 Último mensaje 12 Marzo 2006, 21:20 pm
por Webagent007
TRIGGER EN ORACLE
Bases de Datos
RULZY 2 6,025 Último mensaje 6 Julio 2011, 22:36 pm
por kekehuete
java y trigger
Java
bengy 2 3,243 Último mensaje 12 Junio 2012, 02:52 am
por lluvplay
implementar trigger en php
Bases de Datos
basickdagger 0 2,657 Último mensaje 13 Noviembre 2013, 17:40 pm
por basickdagger
Encontrar un Schmitt Trigger
Electrónica
Meta 1 2,599 Último mensaje 19 Abril 2015, 17:42 pm
por kondrag_X1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines