同一条数据多次插入到数据库中,会形成脏数据,解决的办法是加上唯一索引,之后的操作会先在数据库中查找有没有存在这样一个唯一索引,如果不存在的话会往数据库里面插入一条新的数据,如果存在的话会进行更新的操作。如果在高并发的情景下上述操作不是原子性。解决的办法可以使用mysql 的关键字ON DUPLICATE KEY UPDATE。
具体SQL展示如下
INSERT INTO tbl_data_meter_r (
FFM_ID,
ZX_FLOW,
FX_FLOW,
SS_FLOW,
TOTAL_FLOW,
PIPE_VOLTAGE,
PIPE_PRESSURE,
FREEZE_DATE
) SELECT
f.ID,
h.ZX_FLOW,
h.FX_FLOW,
h.SS_FLOW,
h.TOTAL_FLOW,
h.PIPE_VOLTAGE,
h.PIPE_PRESSURE,
h.FREEZE_DATE
FROM
tbl_data_meter_h h,
(
SELECT
a.ID
FROM
tbl_data_meter_h AS a
INNER JOIN (
SELECT
max(FREEZE_DATE) AS FREEZE_DATE
FROM
tbl_data_meter_h
GROUP BY
IMEI
) AS b ON a.FREEZE_DATE = b.FREEZE_DATE
GROUP BY
a.IMEI
ORDER BY
a.FREEZE_DATE DESC
) s,
tbl_file_flow_meter f
WHERE
h.ID = s.id
AND f.IMEI = h.IMEI ON DUPLICATE KEY UPDATE FFM_ID =VALUES(FFM_ID),
ZX_FLOW =VALUES(ZX_FLOW),
FX_FLOW =VALUES(FX_FLOW),
SS_FLOW =VALUES(SS_FLOW),
TOTAL_FLOW =VALUES(TOTAL_FLOW),
PIPE_VOLTAGE =VALUES(PIPE_VOLTAGE),
PIPE_PRESSURE =VALUES(PIPE_PRESSURE),
FREEZE_DATE =VALUES(FREEZE_DATE)
使用上面的语句之后会发现一个问题,我定义的表id是默认自增,数据重复插入之后id会默认加一,插入一条不重复的数据会比上一条数据ID>2.