如何用SQL每日从Table A同步新增交易数据至Table B
实现Table A到Table B的每日增量同步SQL方案
要实现每日将Table A的新增交易数据同步到Table B,核心思路是识别出Table A中尚未同步到Table B的数据,再批量插入。以下是两种通用的实现方案,适配不同的业务场景:
方案1:基于唯一主键(如交易ID)同步
如果Table A有自增唯一主键(比如transaction_id),可以通过对比Table B中已有的最大主键值,同步比该值更大的新数据:
INSERT INTO Table B (column1, column2, transaction_id, ...) SELECT column1, column2, transaction_id, ... FROM Table A WHERE transaction_id > (SELECT COALESCE(MAX(transaction_id), 0) FROM Table B);
COALESCE用来处理Table B为空的情况(第一次同步时),默认取0,确保所有数据都能被插入。- 如果存在服务器重复推送数据的风险,可以添加重复键处理逻辑:
INSERT INTO Table B (column1, column2, transaction_id, ...) SELECT column1, column2, transaction_id, ... FROM Table A WHERE transaction_id > (SELECT COALESCE(MAX(transaction_id), 0) FROM Table B) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2);
方案2:基于时间戳(如交易创建时间)同步
如果Table A包含记录数据生成时间的字段(比如create_time),可以同步指定时间范围的新增数据:
每日同步当日新增数据
假设服务器每日推送当天的交易数据,直接同步当日数据:
INSERT INTO Table B (column1, column2, create_time, ...) SELECT column1, column2, create_time, ... FROM Table A WHERE DATE(create_time) = CURDATE();
精准同步上次同步后的数据(更可靠)
如果需要避免漏同步或重复同步,可以新增一张同步日志表记录上次同步时间:
-- 1. 创建同步日志表(仅执行一次) CREATE TABLE IF NOT EXISTS sync_log ( sync_id INT AUTO_INCREMENT PRIMARY KEY, last_sync_time DATETIME NOT NULL, sync_date DATE NOT NULL ); -- 2. 初始化同步记录(仅执行一次) INSERT INTO sync_log (last_sync_time, sync_date) VALUES ('1970-01-01 00:00:00', CURDATE()); -- 3. 执行增量同步 INSERT INTO Table B (column1, column2, create_time, ...) SELECT column1, column2, create_time, ... FROM Table A WHERE create_time > (SELECT last_sync_time FROM sync_log ORDER BY sync_id DESC LIMIT 1); -- 4. 更新同步日志 UPDATE sync_log SET last_sync_time = NOW(), sync_date = CURDATE() WHERE sync_id = (SELECT MAX(sync_id) FROM sync_log);
关键注意事项
- 确保Table A和Table B的字段结构完全匹配,或在
INSERT/SELECT语句中明确对应字段,避免字段不匹配报错。 - 建议将上述SQL配置为定时任务(如MySQL事件调度、Linux Crontab、Windows任务计划),实现每日自动执行,无需手动操作。
内容的提问来源于stack exchange,提问作者Ahmed Kashif
相关产品推荐
相关产品推荐

