-- =====================================================================================
-- Fix express_notifications upsert conflict target (message_id)
-- 目的：修复 notify-worker / push-server 在 upsert 时遇到的 42P10：
--      "there is no unique or exclusion constraint matching the ON CONFLICT specification"
-- 原因：历史迁移可能创建了部分唯一索引（WHERE message_id IS NOT NULL），
--      PostgREST 的 upsert `?on_conflict=message_id` 无法匹配该索引。
-- 方案：改为普通 UNIQUE INDEX (message_id)。Postgres UNIQUE 允许多条 NULL，兼容旧数据。
-- 创建日期：2026-03-10
-- =====================================================================================

BEGIN;

-- 1) 预检查：是否存在重复的非空 message_id（若存在，创建唯一索引会失败）
--    如有返回结果，请先人工去重后再继续执行后续语句。
--    示例去重策略：保留最新 created_at，其它行将 message_id 置为 NULL 或删除重复行。
--
-- SELECT message_id, COUNT(*)
-- FROM public.express_notifications
-- WHERE message_id IS NOT NULL
-- GROUP BY message_id
-- HAVING COUNT(*) > 1;

-- 2) 删除历史“部分唯一索引”（如果存在）
DROP INDEX IF EXISTS public.ux_express_notifications_message_id;

-- 3) 创建普通唯一索引，让 `on_conflict=message_id` 正常工作
CREATE UNIQUE INDEX IF NOT EXISTS ux_express_notifications_message_id
  ON public.express_notifications(message_id);

COMMIT;
