-- ============================================================ -- W4 升级脚本:cms_site 嵌套 path(《功能修订方案.md》§8 / 附录 A,幂等) -- 目标库:存量 bsch_cms(生产/预发);干净环境直接用 cms_init.sql 无需本脚本 -- 顺序:加列 → 回填(先顶层后子站,两层固定一轮)→ 约束切换 → 校验 -- ============================================================ -- 1) 加列(存量默认空串,随后回填;已加列则跳过) ALTER TABLE cms_site ADD COLUMN path VARCHAR(191) NOT NULL DEFAULT '' COMMENT '门户路径(顶层=code;子站=父path/code),URL 唯一标识'; -- 2) 回填:先顶层后子站(幂等:仅处理 path='') UPDATE cms_site SET path = code WHERE (parent_site_id = 0 OR parent_site_id IS NULL) AND path = ''; UPDATE cms_site s JOIN cms_site p ON s.parent_site_id = p.id SET s.path = CONCAT(p.path, '/', s.code) WHERE s.parent_site_id > 0 AND s.path = ''; -- 3) 约束切换(存量数据天然满足:code 曾全局唯一 ⇒ path 唯一) ALTER TABLE cms_site DROP INDEX uk_site_code; ALTER TABLE cms_site ADD UNIQUE KEY uk_site_path (path); ALTER TABLE cms_site ADD UNIQUE KEY uk_site_parent_code (parent_site_id, code); -- 4) 校验(应返回 0 行) SELECT id, code, path FROM cms_site WHERE path = ''; -- ============================================================ -- 附:R1 预留模板——学校主站编码改学校 ID(1000xxx)级联重算子站 path -- (切换生成规则后执行;把 {OLD_PREFIX} 替换为旧前缀、按新编码规则回填顶层) -- UPDATE cms_site SET path = CONCAT('1000', sch_id) WHERE parent_site_id = 0 AND code LIKE '{OLD_PREFIX}%'; -- UPDATE cms_site s JOIN cms_site p ON s.parent_site_id = p.id -- SET s.path = CONCAT(p.path, '/', s.code) -- WHERE s.parent_site_id > 0; -- ============================================================