-- Phase 1.1: 会话级单调递增 seq,用于消息排序、去重与断线补拉 ALTER TABLE "ImConversation" ADD COLUMN IF NOT EXISTS "nextSeq" INTEGER NOT NULL DEFAULT 1; ALTER TABLE "ImMessage" ADD COLUMN IF NOT EXISTS "seq" INTEGER NOT NULL DEFAULT 0; ALTER TABLE "ImReadCursor" ADD COLUMN IF NOT EXISTS "lastReadSeq" INTEGER NOT NULL DEFAULT 0; -- 按 createdAt 回填历史 seq WITH ranked AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY "conversationId" ORDER BY "createdAt", id) AS rn FROM "ImMessage" ) UPDATE "ImMessage" m SET seq = ranked.rn FROM ranked WHERE m.id = ranked.id; UPDATE "ImConversation" c SET "nextSeq" = COALESCE(( SELECT MAX(seq) + 1 FROM "ImMessage" WHERE "conversationId" = c.id ), 1); UPDATE "ImReadCursor" rc SET "lastReadSeq" = COALESCE(( SELECT MAX(seq) FROM "ImMessage" m WHERE m."conversationId" = rc."conversationId" AND m."createdAt" <= rc."lastReadAt" ), 0); CREATE INDEX IF NOT EXISTS "ImMessage_conversationId_seq_idx" ON "ImMessage"("conversationId", "seq");