如何避免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
相关产品推荐
相关产品推荐

