Ver Mensaje Individual
  #8 (permalink)  
Antiguo 23/12/2014, 07:58
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: insertar datos en dos tablas y realizar calculos

Montes/Gnzsoloyo, antes que nada, deseandoles una feliz navidad.

Con respecto al tema, creería que la opción mas rápida y eficiente es un trigger. Lo que dice gnzsoloyo en cuanto al performance es cierto si fuera necesario depender del resultado de un query para movilizar el insert actual, sin embargo, veo que esto no es necesario, teniendo en cuenta que el valor a procesar es uno de los parametros de entrada y no es necesario consultarlo.

Tomando como base los calculos que ya gnzsoloyo realizó en el ejemplo, la solución quedaría así:

Código MySQL:
Ver original
  1. CREATE TABLE datos (
  2.   sucuersal_id  int(11) NOT NULL,
  3.   tiempo  datetime NOT NULL,
  4.   dato varchar(1000) NOT NULL,
  5.   PRIMARY KEY (id)
  6.   );
  7.  
  8. CREATE TABLE data_procesado (
  9.   inicio_trama varchar(11) NOT NULL,
  10.   saldo  int(11) NOT NULL,
  11.   voltaje  DECIMAL(14,2) NOT NULL,
  12.   bateria DECIMAL(14,2) NOT NULL,
  13.   codigo_sucursal varchar(20),
  14.   fin_trama varchar(20)
  15.   );
  16.  
  17. DELIMITER $$
  18. CREATE TRIGGER tri_datos
  19.     AFTER INSERT ON datos
  20.     BEGIN
  21.  
  22.     INSERT INTO data_procesado
  23.     VALUES
  24.     (
  25.       TRIM(SUBSTRING_INDEX(NEW.dato, '+', 1)),
  26.       CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.dato, '+', 2),'+', -1)) AS UNSIGNED)*2,
  27.       CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.dato, '+', 3),'+', -1)) AS UNSIGNED)/100,
  28.       CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.dato, '+', 4),'+', -1)) AS UNSIGNED)/1000,
  29.       TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.dato, '+', 5),'+', -1)),
  30.       TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.dato, '+', 6),'+', -1))
  31.     );
  32.    
  33. END$$
  34. DELIMITER ;

El parametro de entrada, sería el nuevo valor de la columna dato, y la operación que se realiza es otro INSERT, por lo que no se genera contención en la operación. Si se tratara de un UPDATE o un valor extraido de un SELECT ejecutado al interior del TRIGGER efectivamente esto podría traer serios problemas de performance.

Posterior a esto, se genera un INSERT sobre la tabla datos.

Código MySQL:
Ver original
  1. mysql> INSERT INTO datos (sucuersal_id,tiempo,dato) VALUES(12345,NOW(),'00E +3189915 +0007180 +0008288 +0455 C+1111');
  2. Query OK, 1 row affected (0.08 sec)
  3.  
  4. mysql> SELECT *FROM datos;
  5. +----+--------------+---------------------+---------------------------------------------+
  6. | id | sucuersal_id | tiempo              | dato                                        |
  7. +----+--------------+---------------------+---------------------------------------------+
  8. |  1 |        12345 | 2014-12-23 08:52:25 | 00E +3189915 +0007180 +0008288 +0455 C+1111 |
  9. +----+--------------+---------------------+---------------------------------------------+
  10. 1 row in set (0.01 sec)
  11.  
  12. mysql> select *from data_procesado;
  13. +--------------+---------+---------+---------+-----------------+-----------+
  14. | inicio_trama | saldo   | voltaje | bateria | codigo_sucursal | fin_trama |
  15. +--------------+---------+---------+---------+-----------------+-----------+
  16. | 00E          | 6379830 |      72 |       8 | 0455 C          | 1111      |
  17. +--------------+---------+---------+---------+-----------------+-----------+
  18. 1 row in set (0.00 sec)


Sin embargo, habría que analizar la tabla data_procesado si requiere de algún index que mejore las consultas o de que forma se requiere el uso de dicha tabla.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 23/12/2014 a las 08:25