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

Trigger con LAST_INSERT_ID()

Estas en el tema de Trigger con LAST_INSERT_ID() en el foro de Mysql en Foros del Web. Hola estoy tratando de llenar una tabla copia con con los campos que se ingresan en la tabla original, pero el valor que me envia ...
  #1 (permalink)  
Antiguo 02/07/2012, 10:48
 
Fecha de Ingreso: julio-2012
Mensajes: 2
Antigüedad: 11 años, 9 meses
Puntos: 0
Trigger con LAST_INSERT_ID()

Hola estoy tratando de llenar una tabla copia con con los campos que se ingresan en la tabla original, pero el valor que me envia en el campo id no es el campo que esta insertado en la tabla original.

Código:
-- Trigger DDL Statements
DELIMITER $$

USE `db_system_eurocafe`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `db_system_eurocafe`.`Modifica_auditoria_inventario`
BEFORE INSERT ON `db_system_eurocafe`.`t_inventario`
FOR EACH ROW
insert into h_inventario (codigoInv,codigoProducto,proveedor,stock,costoCompra,
precioUnitarioCompra,precioUnitarioVenta,ganancia,usuarioIngreso,
fechaIngreso,usuarioModifica,fechaModifica)

VALUES (codigoInv=LAST_INSERT_ID(),NEW.codigoProducto,NEW.proveedor,NEW.stock,NEW.costoCompra,
NEW.precioUnitarioCompra,NEW.precioUnitarioVenta,NEW.ganancia,NEW.usuarioIngreso,
NEW.fechaIngreso,NEW.usuarioModifica,NEW.fechaModifica)$$
la tabla original es esta:
Código:
CREATE TABLE `t_inventario` (
  `codigoInv` int(11) NOT NULL auto_increment,
  `codigoProducto` varchar(15) NOT NULL,
  `proveedor` varchar(50) default NULL,
  `stock` smallint(3) NOT NULL,
  `costoCompra` double(5,2) NOT NULL COMMENT 'costos de compra total por producto.',
  `precioUnitarioCompra` double(5,2) NOT NULL COMMENT 'precio para cliente',
  `precioUnitarioVenta` double NOT NULL,
  `ganancia` double(5,2) NOT NULL COMMENT 'valor fijo que se adicionara al precio del producto',
  `usuarioIngreso` varchar(15) NOT NULL,
  `fechaIngreso` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `usuarioModifica` varchar(15) NOT NULL,
  `fechaModifica` datetime NOT NULL,
  PRIMARY KEY  (`codigoInv`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=47 ;
la tabla copia es esta:
Código:
-- 
-- Estructura de tabla para la tabla `copia_inventario`
-- 

CREATE TABLE `h_inventario` (
  `id` int(11) NOT NULL auto_increment,
  `codigoInv` int(11) NOT NULL,
  `codigoProducto` varchar(15) NOT NULL,
  `proveedor` varchar(50) NOT NULL,
  `stock` smallint(3) NOT NULL,
  `costoCompra` double(5,2) NOT NULL COMMENT 'costos de compra total por producto.',
  `precioUnitarioCompra` double(5,2) NOT NULL COMMENT 'precio para cliente',
  `precioUnitarioVenta` double NOT NULL,
  `ganancia` double(5,2) NOT NULL COMMENT 'valor fijo que se adicionara al precio del producto',
  `usuarioIngreso` varchar(15) NOT NULL,
  `fechaIngreso` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `usuarioModifica` varchar(15) NOT NULL,
  `fechaModifica` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=50 ;
el campo codigoInv es el que me intersa que me guarde tal cual se genera en la tabla original, pero me envia un dato que nada que ver

alguna idea, para solucionar este problem.

Gracias.
  #2 (permalink)  
Antiguo 02/07/2012, 11:29
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: Trigger con LAST_INSERT_ID()

Por lo pronto, esto:
Código MySQL:
Ver original
  1. codigoInv=LAST_INSERT_ID()
dentro del VALUES, no tiene nigún sentido. Es una comparación lógica que devolvería TRUE o FALSE, pero no devolverá jamás el ID de la primera tabla.

Por otro lado, el TRIGGER es un BEFORE INSERT, es decir "antes de insertar", y antes de insertar el LAST_INSERT_ID() vale cero (0), es decir, no hay valor generado...
¿No crees que en todo caso, deberías usarlo después de insertar?

Finalmente: Una auditoría que duplique datos, no tiene mucho sentido... ¿Estás seguro que eso es lo que deseas hacer?
¿No sería mejor una auditoría que guarde ciertos datos, o que guarde información acerca de la operación, y no la operación duplicada?
__________________
¿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 02/07/2012, 11:49
 
Fecha de Ingreso: julio-2012
Mensajes: 2
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Trigger con LAST_INSERT_ID()

Es correcto mi estimado gnzsoloyo, gracias por la aclaracion es lo malo de ser novato en este tema y lo malo de solo tomar codigos (copiar y pegar) jajajaja saludos mi estimado y gracias por la humilde pero eficaz respuesta.

como vereis lo e corregido y dejado tal como pensaba que era jajajaja claro con la sujerencia de antes y despues ( buen punto de partida ) y funciona perfecto, lo pego por si alguien esta en el mismo dilema.

y aprovechando de tu conocimiento. mi idea es hacer un trigger para un Insert que este caso y tambien aplicarle un Update pero quisiera hacerlo en el mismo trigger. es decir si fue un insert que ejecute este, y si es un update pues que ejecute otro similar, pero no encuentro manera de unir ambos.

Salu2


codigo funcionando perfect Gracias a: gnzsoloyo
Código:
-- Trigger DDL Statements
DELIMITER $$

USE `db_system_eurocafe`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `db_system_eurocafe`.`Modifica_auditoria_inventario`
AFTER INSERT ON `db_system_eurocafe`.`t_inventario`
FOR EACH ROW
insert into h_inventario (codigoInv,codigoProducto,proveedor,stock,costoCompra,
precioUnitarioCompra,precioUnitarioVenta,ganancia,usuarioIngreso,
fechaIngreso,usuarioModifica,fechaModifica)

VALUES (NEW.codigoInv,NEW.codigoProducto,NEW.proveedor,NEW.stock,NEW.costoCompra,
NEW.precioUnitarioCompra,NEW.precioUnitarioVenta,NEW.ganancia,NEW.usuarioIngreso,
NEW.fechaIngreso,NEW.usuarioModifica,NEW.fechaModifica)$$

Etiquetas: tabla, trigger, campos
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 19:22.