You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中查找并插入缺失数据且不生成重复记录

日度指标表缺失日期补全方案

前置要求

首先需要为表创建唯一联合索引,用于避免重复插入相同指标、参考日期、指标日期的记录:

ALTER TABLE appweb_ind_exeindicadores ADD UNIQUE INDEX idx_unique_indicator_date (fk_indicador_id, datareferencia, dataindicador);

补数逻辑

通过递归CTE生成指定范围内的完整日期序列,和全表所有(fk_indicador_id, datareferencia)组合做笛卡尔积得到所有应该存在的记录,插入时自动跳过已存在的记录即可。

MySQL 8.0+ 实现代码

INSERT IGNORE INTO appweb_ind_exeindicadores (fk_indicador_id, datareferencia, dataindicador)
WITH RECURSIVE date_series AS (
    -- 可根据实际需要修改补数的起止日期
    SELECT DATE('2021-09-01') AS ds
    UNION ALL
    SELECT ds + INTERVAL 1 DAY FROM date_series WHERE ds < DATE('2021-09-30')
),
indicator_groups AS (
    SELECT DISTINCT fk_indicador_id, datareferencia 
    FROM appweb_ind_exeindicadores
    -- 如需仅补特定月份的数据,可添加过滤条件,如:
    -- WHERE datareferencia >= '2021-09-01' AND datareferencia < '2021-10-01'
)
SELECT 
    ig.fk_indicador_id, 
    ig.datareferencia, 
    ds.ds AS dataindicador
    -- 如需补其他字段的默认值,可在此处添加对应字段,如 0 AS indicator_value, NOW() AS create_time
FROM indicator_groups ig
CROSS JOIN date_series ds
-- 限定指标日期和参考日期为同一年月,可根据业务规则调整
WHERE MONTH(ds.ds) = MONTH(ig.datareferencia) AND YEAR(ds.ds) = YEAR(ig.datareferencia);

PostgreSQL 实现代码

INSERT INTO appweb_ind_exeindicadores (fk_indicador_id, datareferencia, dataindicador)
WITH RECURSIVE date_series AS (
    SELECT '2021-09-01'::DATE AS ds
    UNION ALL
    SELECT ds + INTERVAL '1 day' FROM date_series WHERE ds < '2021-09-30'::DATE
),
indicator_groups AS (
    SELECT DISTINCT fk_indicador_id, datareferencia 
    FROM appweb_ind_exeindicadores
)
SELECT ig.fk_indicador_id, ig.datareferencia, ds.ds AS dataindicador
FROM indicator_groups ig
CROSS JOIN date_series ds
WHERE EXTRACT(MONTH FROM ds.ds) = EXTRACT(MONTH FROM ig.datareferencia) 
AND EXTRACT(YEAR FROM ds.ds) = EXTRACT(YEAR FROM ig.datareferencia)
ON CONFLICT (fk_indicador_id, datareferencia, dataindicador) DO NOTHING;

注意事项

  • INSERT IGNORE(MySQL)和ON CONFLICT DO NOTHING(PG)会自动跳过唯一索引冲突的记录,已存在的日期数据不会被覆盖或重复插入
  • 如果你的业务要求dataindicador的范围不是和datareferencia同月,可自行调整WHERE语句的过滤条件
  • 如需补全其他字段的值,只需在INSERT的字段列表和SELECT查询中添加对应字段的默认值即可

内容的提问来源于stack exchange,提问作者GABRIEL MELLO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:15:01