ALTER TABLE message ADD COLUMN IF NOT EXISTS seq BIGINT NOT NULL DEFAULT 0; WITH ranked AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY channel_id ORDER BY created_at ASC, id ASC) AS rn FROM message WHERE seq = 0 ) UPDATE message m SET seq = ranked.rn FROM ranked WHERE m.id = ranked.id; CREATE UNIQUE INDEX IF NOT EXISTS idx_message_channel_seq ON message (channel_id, seq);