-- 已有库完成 004/005/006/007 后执行;最新空库基线包含此结构,不执行本文件。 -- 旧收藏全部保持功能收藏(新列 NULL),不猜测具体底图,不改旧 likes。 -- 删除旧唯一约束并创建两种部分唯一索引均在同一事务内完成。 BEGIN; SET LOCAL TIME ZONE 'UTC'; SET LOCAL lock_timeout = '5s'; SET LOCAL search_path = public, pg_catalog; ALTER TABLE public.favorites ADD COLUMN worksheet_resource_id varchar(128) COLLATE "C", ADD CONSTRAINT favorites_resource_id_check CHECK ( worksheet_resource_id IS NULL OR length(btrim(worksheet_resource_id)) > 0 ); ALTER TABLE public.favorites DROP CONSTRAINT favorites_user_worksheet_key; -- NULL 表示功能收藏;非 NULL 表示完整内容收藏,不另加 type 字段。 -- 部分唯一索引分别去重,允许同用户收藏一个功能及其中多个资源。 CREATE UNIQUE INDEX favorites_user_worksheet_key ON public.favorites (user_id, worksheet_id) WHERE worksheet_resource_id IS NULL; CREATE UNIQUE INDEX favorites_user_resource_key ON public.favorites (user_id, worksheet_resource_id) WHERE worksheet_resource_id IS NOT NULL; COMMENT ON TABLE public.favorites IS '功能和完整内容的当前收藏;取消即删除;仅功能收藏增减 worksheets.likes'; COMMENT ON COLUMN public.favorites.worksheet_id IS '稳定功能逻辑关联;内容收藏的功能归属由服务端查询确定,历史缺失时保留'; COMMENT ON COLUMN public.favorites.worksheet_resource_id IS 'NULL 是功能收藏,非 NULL 是完整内容收藏;逻辑关联,缺失/下架不清空,不退化为功能收藏'; COMMIT;