diff --git a/apps/backend/src/db/migrations/129_fulfillment_retry_semantics.sql b/apps/backend/src/db/migrations/129_fulfillment_retry_semantics.sql index 304a1f34..b1851b38 100644 --- a/apps/backend/src/db/migrations/129_fulfillment_retry_semantics.sql +++ b/apps/backend/src/db/migrations/129_fulfillment_retry_semantics.sql @@ -90,6 +90,27 @@ SET internal_sku = canonicalize_internal_sku(internal_sku), updated_at = NOW() WHERE internal_sku <> canonicalize_internal_sku(internal_sku); +-- 人工 SKU 登记表是扫描派生数据。历史数据可能因大小写/空白差异登记了多行, +-- 规范化后会撞唯一键;先去重,优先保留有配置、统计更完整且更新时间更晚的行。 +WITH ranked_registry AS ( + SELECT + id, + ROW_NUMBER() OVER ( + PARTITION BY canonicalize_internal_sku(sku_key) + ORDER BY + (config_id IS NOT NULL) DESC, + item_count DESC, + updated_at DESC, + id DESC + ) AS candidate_rank + FROM manual_sku_registry + WHERE canonicalize_internal_sku(sku_key) IS NOT NULL +) +DELETE FROM manual_sku_registry registry +USING ranked_registry ranked +WHERE registry.id = ranked.id + AND ranked.candidate_rank > 1; + UPDATE manual_fulfillment_configs SET sku_key = canonicalize_internal_sku(sku_key), updated_at = NOW()