-- 补 patient_transactions 缺失的幂等键 partial UNIQUE。
--
-- 背景:schema 注释一直写"MIGRATION partial UNIQUE (host_id, tenant_id, source_event_id)
--   WHERE source_event_id IS NOT NULL",但 init migration 从没真正建过 → 幂等从未在 DB 层强制:
--     · createMany({skipDuplicates:true}) 失效(无约束可依据 → 全插入)
--     · per-row create 的 P2002 catch 永不触发 → 重复导入产生重复 tx 行
--   fact 层的 (subject_id, version) UNIQUE 是真建了的,所以 fact 没坏,只有 tx 层有重复风险。
--
-- 本 migration:
--   1. 先 dedup 已有重复(保留每组最小 event_seq 的那行 = 最早写入)
--   2. 再建 partial UNIQUE 索引
--
-- ⚠️ dedup DELETE 会删掉重复 tx 行;这些行衍生的 fact 仍在(fact 按 subject_id+version 去重,
--    不受影响),只是 fact.transaction_ids 里可能引用被删 tx id(审计软引用,可接受)。

-- 1. dedup:同 (host_id, tenant_id, source_event_id) 保留最早(event_seq 最小)那行
DELETE FROM "patient_transactions" a
USING "patient_transactions" b
WHERE a."source_event_id" IS NOT NULL
  AND a."host_id" = b."host_id"
  AND a."tenant_id" = b."tenant_id"
  AND a."source_event_id" = b."source_event_id"
  AND a."event_seq" > b."event_seq";

-- 2. 建 partial UNIQUE(幂等键正式生效)
CREATE UNIQUE INDEX "patient_transactions_source_event_uq"
  ON "patient_transactions" ("host_id", "tenant_id", "source_event_id")
  WHERE "source_event_id" IS NOT NULL;
