如何用SQL实现仅同步订单表中状态变更行至SFTP服务器?
实现方案
1. 新增状态变更跟踪表
首先得建一张辅助表,用来记录每个订单最后一次同步时的状态和时间,后续靠它和订单表对比找出状态变更的行:
CREATE TABLE order_sync_log ( order_id INT PRIMARY KEY, -- 和订单表主键关联 last_sync_status VARCHAR(50), -- 最后一次同步的订单状态 last_sync_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 同步时间戳 );
2. 首次全量同步
第一次执行时直接导出订单表所有数据,同时把这些数据写入跟踪表做记录:
-- 导出全量数据(具体导出CSV的语法看数据库类型,比如MySQL用INTO OUTFILE,PostgreSQL用COPY) SELECT * FROM orders; -- 将全量数据写入跟踪表,后续用来做对比 INSERT INTO order_sync_log (order_id, last_sync_status) SELECT order_id, status FROM orders ON DUPLICATE KEY UPDATE last_sync_status = VALUES(last_sync_status), last_sync_time = CURRENT_TIMESTAMP;
3. 后续增量同步(仅状态变更行)
每次同步时,先筛选出订单表和跟踪表状态不一致的行(包括新增订单),导出这些行后再更新跟踪表:
-- 第一步:查询需要同步的状态变更/新增订单(用于导出CSV) SELECT o.* FROM orders o LEFT JOIN order_sync_log osl ON o.order_id = osl.order_id WHERE osl.last_sync_status IS NULL -- 处理新增的订单 OR o.status != osl.last_sync_status; -- 处理状态变更的订单 -- 第二步:更新跟踪表,记录最新的状态和同步时间 INSERT INTO order_sync_log (order_id, last_sync_status) SELECT order_id, status FROM orders ON DUPLICATE KEY UPDATE last_sync_status = VALUES(last_sync_status), last_sync_time = CURRENT_TIMESTAMP;
4. 优化技巧(如果订单表有状态更新时间)
如果订单表本身有status_updated_at这类记录状态变更时间的字段,可以直接按时间筛选,提升查询效率:
SELECT o.* FROM orders o WHERE o.status_updated_at > (SELECT MAX(last_sync_time) FROM order_sync_log);
内容的提问来源于stack exchange,提问作者Tom Caipas
相关产品推荐
相关产品推荐

