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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:20