diff --git a/tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql b/tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql new file mode 100644 index 00000000..3112e322 --- /dev/null +++ b/tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql @@ -0,0 +1,26 @@ +-- 030_avito_imv_cache_key_unique.sql +-- Hotfix: добавить UNIQUE constraint на avito_imv_evaluations.cache_key +-- +-- Stage 1 миграция 018 создала только non-unique `imv_cache_key_idx` — +-- но `save_imv_evaluation` использует `ON CONFLICT (cache_key) DO UPDATE`, +-- что требует UNIQUE/exclusion constraint, иначе runtime error: +-- ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +-- +-- Закрывает blocker reviewer'а на PR #452 (Stage 3 IMV estimator integration). +-- +-- Apply after: 018_avito_imv_evaluations.sql (Stage 1) +-- Required by: estimator IMV cache save flow (Stage 3, PR #452) + +BEGIN; + +-- Защитная очистка дубликатов по cache_key (если данные уже наливались). +-- На свежей БД (cache_key никогда не writev до этого PR) — no-op. +DELETE FROM avito_imv_evaluations a +USING avito_imv_evaluations b +WHERE a.id < b.id AND a.cache_key = b.cache_key; + +-- Сам UNIQUE constraint через индекс (CONCURRENTLY не нужен — таблица свежая/пустая). +CREATE UNIQUE INDEX IF NOT EXISTS imv_cache_key_uniq_idx + ON avito_imv_evaluations (cache_key); + +COMMIT;