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

copiar valor de un campo de la tabla en otro campo de la misma tabla

Estas en el tema de copiar valor de un campo de la tabla en otro campo de la misma tabla en el foro de Mysql en Foros del Web. Eso estoy intentando hacer amig@s. Ya sé que mysql no te deja, en un INSERT INTO normal, copiar el valor que tiene un campo de ...
  #1 (permalink)  
Antiguo 21/10/2009, 03:00
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 3 meses
Puntos: 2
copiar valor de un campo de la tabla en otro campo de la misma tabla

Eso estoy intentando hacer amig@s.
Ya sé que mysql no te deja, en un INSERT INTO normal, copiar el valor que tiene un campo de una tabla en otro campo de esa misma tabla. Pero lo intento hacer con un trigger y, será por la sintaxis, también me da errores.
Vereis, tengo varias formas de cómo podría hacerse
Código:
CREATE TRIGGER EMP_USERS_trinsNAME AFTER INSERT ON emp_users FOR EACH ROW
BEGIN

UPDATE emp_users SET new.name = (SELECT new.username FROM emp_users)

END

CREATE TRIGGER EMP_USERS_trinsNAME AFTER INSERT ON emp_users FOR EACH ROW
BEGIN
DECLARE nombre TYPE varchar;
SET nombre=(SELECT new.username FROM emp_users);

UPDATE emp_users SET new.name = nombre;

END
Pero todas las que pruebo me acaban faiando.
Sabríais si realmente es posible hacer lo que quiero hacer con MySQL??

Muchas gracias!!
  #2 (permalink)  
Antiguo 21/10/2009, 04: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, 4 meses
Puntos: 2658
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

No, y en ninguna otro DBMS. Es un problema de sentencias. No puedes hacer una operación DML en un trigger que afecte a la misma tabla que está ejecutando un trigger que se invoca con la misma sentencia que lo disparó....
Es decir, en tanto sigas poniendo UPDATE te dará error en el primero y segundo casos.
Además, en el segundo caso usas TYPE, que no es cláusula MySQL.

Lo que tienes que hacer es operar con el concepto de las pseudovariables NEW y OLD (NEW en este caso):

Código SQL:
Ver original
  1. CREATE TRIGGER EMP_USERS_trinsNAME AFTER INSERT ON emp_users FOR EACH ROW
  2. BEGIN
  3.     SET NEW.name= NEW.username;
  4. END
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/10/2009, 04:49
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Gracias gnzsoloyo, pero ahora ha cambiado del error 1064 al error 1362(SQLSTATE: HY000 (ER_TRG_CANT_CHANGE_ROW) ). Vamos, que el trigger no puede cambiar la fila...

Y no podría crear un disparador que iamase a un procedimiento que sí lo hiciese?? entonces ia no sería el disparador el que actuaría sobre la misma fila que está insertando.
La verdad es que de MySQL tengo muy poquita idea, tanto de sintaxis como de potencia. Voy a ver si busco algo y luego os cuento. Aunque si podeis aiudarme mientras tanto con la sintaxis mejor.

Gracias de nuevo!!
  #4 (permalink)  
Antiguo 21/10/2009, 05:16
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, 4 meses
Puntos: 2658
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Cita:
Y no podría crear un disparador que iamase a un procedimiento que sí lo hiciese??
Un TRIGGER bloquea la tabla en proceso. por ello es inútil intentarlo a través de un proceso.
Pruebalo como un BEFORE INSERT, y asegúrate de no estar ingresando el campo a modificar.

CREATE TRIGGER EMP_USERS_trinsNAME BEFORE INSERT
ON emp_users FOR EACH ROW
BEGIN
SET NEW.name = NEW.username;
END

No creo puntualmetente que no pueda cambiar la fila, porque yo hago tareas semejantes con otros trigger. Por ejemplo:
Código sql:
Ver original
  1. DROP TRIGGER IF EXISTS SET_ITEMFACTURA ;
  2. DELIMITER $$
  3. CREATE TRIGGER SET_ITEMFACTURA BEFORE INSERT
  4. ON FACTURA_DETALLE
  5. FOR EACH ROW
  6. BEGIN
  7.         IF(SELECT MAX(SUBITEM) FROM FACTURA_DETALLE WHERE FACTURA_ID=NEW.FACTURA_ID) IS NULL THEN
  8.       SET NEW.SUBITEM = 1;
  9.     ELSE
  10.       SET NEW.SUBITEM = (SELECT MAX(SUBITEM) FROM FACTURA_DETALLE WHERE FACTURA_ID=NEW.FACTURA_ID) + 1;
  11.     END IF;
  12. END$$
  13. DELIMITER ;

Este es un TRIGGER algo rústico que lo que hace es ponerle el número de subitem al detalle de una factura. Esta tarea ya no la hago de esta forma, pero el TRIGGER siempre funcionó bien, y como ves, estoy modificando la propia fila ingresada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/10/2009, 05:56
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Sí, ia veo que tú lo haces, y es una forma muy lógica de hacerlo.
Pero según estoy viendo me da faio hasta el simple update, sin trigger ni nada.
Código:
 
UPDATE emp_users SET name = 'nombre' WHERE id = (SELECT MAX(id) FROM emp_users)
Con lo que tú me has dicho, probando el BEFORE en lugar del AFTER me da el otro error. Uno el 1064(BEFORE) y el otro el 1362(AFTER).

No sé lo que está ocurriendo aquí, pues tengo todos los permisos...
A ver si puedo enviarlo a la base de datos desde el código por lo menos.

Un saludo, ia os contaré. Pero si se os ocurre una solución mejor no dudeis en decírmela.
  #6 (permalink)  
Antiguo 21/10/2009, 06: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, 4 meses
Puntos: 2658
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Error 1064 es un error de sitaxis.
Postea el código completo del trigger.
__________________
¿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 21/10/2009, 07:23
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Código:
 CREATE TRIGGER EMP_USERS_trinsNAME AFTER INSERT ON emp_users FOR EACH ROW
      BEGIN
          SET NEW.name= NEW.username;
      END
Este me daría el error 1362

Código:
 CREATE TRIGGER EMP_USERS_trinsNAME BEFORE INSERT ON emp_users FOR EACH ROW
      BEGIN
          SET NEW.name= NEW.username;
      END
Y este el 1064.

No he hecho ninguna variación a como me lo escribiste tú. Y bien raro es que sólo por cambiar la palabra after por before me de un error de sintaxis...
  #8 (permalink)  
Antiguo 21/10/2009, 07:42
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, 4 meses
Puntos: 2658
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Acabo de probar el modelo de TRIGGER en una base experimental que uso. Anduvo bien.

Bien, entonces, vamos por partes:
¿Qué estas usando para insertar el TRIGGER en la base? ¿Navicat?, ¿PhpMyAdmin?, ¿MySQL Query Browser?, ¿Consola de MySQL?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 21/10/2009, 09:35
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Uso phpMyAdmin.
Pero al final he pensado que sería mejor pasar las variables de otra forma y así también quitarle un campo a la base de datos que he visto resulta inútil.
He solucionado el problema y ha sido con código desde la aplicación.

Muchas gracias amig@, siento no haber sido más perseverante para encontrar el faio, pero en el trabajo el tiempo apremia...

Espero que esto pueda servirle a otra persona.

Un saludo!!
  #10 (permalink)  
Antiguo 21/10/2009, 10:19
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, 4 meses
Puntos: 2658
Respuesta: copiar valor de un campo de la tabla en otro campo de la misma tabla

Lástima... Estabamos a un paso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 04:10.