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

如何避免MySQL中当日重复插入相同记录?

解决当日重复插入记录的方案

针对你遇到的当日重复插入相同Insertion Date和Account Number记录的问题,有两种实用的解决办法:


方法一:插入前过滤已存在的记录

直接在插入的SELECT语句里加过滤条件,只选取当日尚未插入过的账号记录。修改后的存储过程如下:

CREATE PROCEDURE `insert_daily_records`()
BEGIN
    INSERT INTO table1 (
        `Insertion Date`, 
        `Last Updated`,
        `Account Number`
    ) 
    SELECT 
        CURDATE(),
        NOW(), -- 这里用NOW()获取当前时间戳,替代原来的NULL更合理
        `Account Number`
    FROM view1
    WHERE NOT EXISTS (
        SELECT 1 
        FROM table1 
        WHERE `Insertion Date` = CURDATE() 
          AND `Account Number` = view1.`Account Number`
    );
END

逻辑说明:通过NOT EXISTS子查询检查当前日期下,该账号是否已经存在于table1中,只有不存在的才会被插入。


方法二:数据库层面加唯一约束(更可靠)

先给table1创建一个由Insertion Date和Account Number组成的唯一索引,从数据库层面阻止这两个字段组合重复的记录:

ALTER TABLE table1 
ADD UNIQUE INDEX idx_date_account (`Insertion Date`, `Account Number`);

之后可以选择两种插入策略:

策略1:跳过重复记录

如果重复时只想跳过不插入,用INSERT IGNORE:

CREATE PROCEDURE `insert_daily_records`()
BEGIN
    INSERT IGNORE INTO table1 (
        `Insertion Date`, 
        `Last Updated`,
        `Account Number`
    ) 
    SELECT 
        CURDATE(),
        NOW(),
        `Account Number`
    FROM view1;
END

策略2:重复时更新最后更新时间

如果希望重复运行时,把已存在记录的Last Updated更新为当前时间,用INSERT ... ON DUPLICATE KEY UPDATE:

CREATE PROCEDURE `insert_daily_records`()
BEGIN
    INSERT INTO table1 (
        `Insertion Date`, 
        `Last Updated`,
        `Account Number`
    ) 
    SELECT 
        CURDATE(),
        NOW(),
        `Account Number`
    FROM view1
    ON DUPLICATE KEY UPDATE `Last Updated` = NOW();
END

逻辑说明:唯一索引会让数据库识别Insertion Date+Account Number的重复,IGNORE会直接跳过插入,ON DUPLICATE KEY UPDATE则会执行更新操作,适合需要保留最新运行时间的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:31:02