MySQL - mysql triggers duplica datos

 
Vista:
Imágen de perfil de patricio
Val: 3
Ha aumentado su posición en 32 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

mysql triggers duplica datos

Publicado por patricio (2 intervenciones) el 25/04/2018 14:22:46
Buenos dias, una pregunta colegas, cree un triger para que insertes datos en otra tabla pero al
momento de registrar me duplica los datos. asi

1
2
3
4
5
6
7
8
9
10
DELIMITER |
CREATE TRIGGER TR_PRECIOS_MEDIDAS_A_VALORIZADO AFTER INSERT
ON MEDIDAS
FOR EACH ROW
BEGIN
REPLACE VALORIZADO (ID_MEDIDOR, ID_CONTRATO, FECHA_Y_HORA, MEDIDA_MEDIDOR_CONTRATO_KWH)
SELECT PRECIOS.ID_MEDIDOR, PRECIOS.ID_CONTRATO, PRECIOS.FECHA_Y_HORA, (PRECIOS.FACTOR_PRORRATA*MEDIDAS.MEDIDA_MEDIDOR_KWH)
FROM PRECIOS, MEDIDAS
WHERE PRECIOS.FECHA_Y_HORA = MEDIDAS.FECHA_Y_HORA;
END |

pero en la tabla valorizado duplica los datos al momento de dispararse el trigger.
como puedo condicionarlo que solo inserte el nuevo dato y que los datos se guarden pero sin duplicar?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

mysql triggers duplica datos

Publicado por leonardo_josue (414 intervenciones) el 26/04/2018 15:41:18
Hola patricio:

Estás seguro de que te está duplicando todos los datos? o solo algunos? un registro se considera duplicado si y solo si TODOS sus campos son exactamente iguales, si uno solo de ellos es distinto entonces no puedes hablar de registros duplicados.

El problema puede ser por varias cosas:

1. Revisa el número de registros que te está regresando el SELECT... es posible que al estar haciendo JOIN entre dos tablas se esté ocasionando un producto cartesiano entre tus tablas. En este caso deberías de asegurarte en poner todas las condiciones de unión entre las tablas. También podrías utilizar INNER JOIN en lugar de listar tus tablas en el FROM-WHERE... es más óptimo.

2. Ojo con las comparaciones de Fecha y hora. Revisa que el detalle de la fecha y la hora sean iguales, ya que una variación de una fracción de segundo ya arrojaría resultados distintos.

3. Postea la estructura de tus tablas y pon algunos datos de ejemplo. a partir de estos danos dinos qué es lo que se está duplicando.

4. En tu TRIGGER veo que nunca utilizas los valores que acabas de insertar (NEW) por lo tanto siempre estarías haciendo un REPLACE sobre TODOS LOS REGISTROS de tu tabla. ¿Esto es correcto?

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de patricio
Val: 3
Ha aumentado su posición en 32 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

mysql triggers duplica datos

Publicado por patricio (2 intervenciones) el 26/04/2018 16:10:48
gracias leo por tu respuesta, ya solucione este tema del trigger ahora estoy con otro problema, quizas tu me ayudes o me guies.

en la tabla valorizado tendo dos id mas fecha y hora,
esto necesito actualizar con valores de un id que esta asignado a otro id.

me explico, tengo una barra que puede tener muchos medidores, pero en la tabla valorizado esta el id del medidor y por medio este
necesito llegar al id de la barra asignada y la barra tiene precios por horas, y ese precio por hora de la barra necesito multiplicarlo por un dato
en la tabla valorizado pero la fecha del precio de cmg tiene que ser igual a la de valorizado, anotare las tablas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**CREACION DE TABLAS CON SUS RELACIONES**/
CREATE TABLE BARRAS(
ID_BARRA INT NOT NULL,
NOMBRE_BARRA VARCHAR(25),
ZONA VARCHAR(25),
REGION VARCHAR(25),
COMUNA VARCHAR(25)
);
 
CREATE TABLE MEDIDORES(
ID_MEDIDOR INT NOT NULL,
ID_BARRA INT,
NOMBRE_MEDIDOR VARCHAR(25),
TIPO_MEDIDOR_C_G_R VARCHAR(25)
);
 
CREATE TABLE MEDIDAS(
ID_MEDIDOR INT,
FECHA_Y_HORA DATETIME,
MEDIDA_MEDIDOR_KWH FLOAT,
FECHA_Y_HORA_ACTUALIZADO DATETIME DEFAULT CURRENT_TIMESTAMP,
FLAG_DEFINITIVO BIT DEFAULT 0
);
 
CREATE TABLE CMG(
ID_BARRA INT NOT NULL,
FECHA_Y_HORA DATETIME,
CMG_CLP_KWH FLOAT,
CMG_USD_MWH FLOAT,
FECHA_Y_HORA_ACTUALIZADO DATETIME DEFAULT CURRENT_TIMESTAMP,
FLAG_DEFINITIVO BIT DEFAULT 0
);
 
 
CREATE TABLE CONTRATOS(
ID_CONTRATO INT AUTO_INCREMENT PRIMARY KEY,
NOMBRE_CONTRATO VARCHAR(25),
NOMBRE_CLIENTE VARCHAR(25),
TIPO_CLIENTE_L_D_G CHAR(1)
);
 
CREATE TABLE PRECIOS(
ID_CONTRATO INT,
ID_MEDIDOR INT,
FECHA_Y_HORA DATETIME,
PRECIO_CLP_KWH FLOAT,
PRECIO_USD_MWH FLOAT,
FACTOR_PRORRATA FLOAT,
FECHA_Y_HORA_ACTUALIZADO DATETIME DEFAULT CURRENT_TIMESTAMP,
FLAG_MARGEN_SOBRE_CMG BIT DEFAULT 0,
FLAG_DEFINITIVO BIT DEFAULT 0
);
 
CREATE TABLE VALORIZADO(
ID_MEDIDOR INT NOT NULL,
ID_CONTRATO INT NOT NULL,
FECHA_Y_HORA DATETIME,
MEDIDA_MEDIDOR_CONTRATO_KWH FLOAT,
VALORIZADO_CMG_CLP FLOAT,
VALORIZADO_CMG_USD FLOAT,
VALORIZADO_CONTRATO_CLP FLOAT,
VALORIZADO_CONTRATO_USD FLOAT,
FECHA_Y_HORA_ACTUALIZADO DATETIME DEFAULT CURRENT_TIMESTAMP,
MARGEN_CLP FLOAT,
MARGEN_USD FLOAT,
FLAG_DEFINITIVO BIT DEFAULT 0
);
 
CREATE TABLE TASA_CAMBIO_OFICIAL(
ID_CONTRATO INT,
FECHA_Y_HORA DATETIME,
TASA_CLP_POR_USD_OFICIAL FLOAT,
FECHA_Y_HORA_ACTUALIZADO DATETIME DEFAULT CURRENT_TIMESTAMP,
FLAG_DEFINITIVO BIT DEFAULT 0,
PRIMARY KEY (ID_CONTRATO, FECHA_Y_HORA),
CONSTRAINT FK_CONTRATOS_TASA_CAMBIO_OFICIAL FOREIGN KEY (ID_CONTRATO)
REFERENCES CONTRATOS (ID_CONTRATO)
);
 
CREATE TABLE TASA_CAMBIO_CONTRATOS(
ID_CONTRATO INT,
FECHA_Y_HORA DATETIME,
TASA_CLP_POR_USD_CONTRATO FLOAT,
FECHA_Y_HORA_ACTUALIZADO DATETIME DEFAULT CURRENT_TIMESTAMP,
FLAG_DEFINITIVO BIT DEFAULT 0,
PRIMARY KEY (ID_CONTRATO, FECHA_Y_HORA),
CONSTRAINT FK_CONTRATOS_TASA_CAMBIO_CONTRATOS FOREIGN KEY (ID_CONTRATO)
REFERENCES CONTRATOS (ID_CONTRATO)
);
/**con este select puedo ver el medidor asigando de la barra y que sean iguales las horas pero al momento de un update no resulta*/
SELECT VALORIZADO.ID_MEDIDOR, VALORIZADO.FECHA_Y_HORA, VALORIZADO.MEDIDA_MEDIDOR_CONTRATO_KWH, MEDIDORES.NOMBRE_MEDIDOR,
BARRAS.ID_BARRA, BARRAS.NOMBRE_BARRA, CMG.ID_BARRA, CMG.FECHA_Y_HORA, CMG.CMG_CLP_KWH
FROM VALORIZADO, MEDIDORES, BARRAS, CMG
WHERE VALORIZADO.ID_MEDIDOR=MEDIDORES.ID_MEDIDOR
AND MEDIDORES.ID_BARRA=BARRAS.ID_BARRA
AND BARRAS.ID_BARRA=CMG.ID_BARRA
AND VALORIZADO.FECHA_Y_HORA=CMG.FECHA_Y_HORA;


gracias por tu tiempo!!
Patricio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar