-- ============================================================ -- 表单中心 T16 · app 注册表 DDL(MySQL 5.7 兼容复核版) -- 范围:《表单中心契约v2》§5.2/§17.2 一笔 = 建表 app_registry -- 验收:V59(零角色字段)/ V65(uk(app_code) 全库唯一 + 保留字)/ V69(CRUD 与在用禁删) -- 用途:生产 ddl-auto=none 时的升级脚本;开发期(本机 bsch_formcenter,ddl-auto=update)由 Hibernate -- 自动追加,本脚本同时是"实表应当长什么样"的评审权威(沿 t2/t3/t10 先例)。 -- 5.7 复核要点:①无 CTE/WITH、无函数索引、无生成列、无 CHECK 约束;②utf8mb4 显式写 CHARSET/COLLATE; -- ③InnoDB、无物理外键——form.app_code 对注册表是逻辑引用(§5.2 明令"不校验存在性亦可建 -- 表单",建 FK 等于把这条改写成强引用,快应用还没注册就先建表的老数据会直接进不来); -- ④本表无可空列(is_deleted/sch_id 都 NOT NULL,审计列按 P5 实态 DEFAULT NULL)。 -- **零角色字段(D14/V59 红线)**:全表只有 app_code / name / sch_id / is_deleted 四个业务列 -- + BaseEntity 四审计列。任何"谁能用这个 app""app 的管理员"之类的列都不许加—— -- 把授权塞回注册表正是 v2 要出清的东西(§19 作废-1/2 的同一件事)。 -- 唯一键口径:uk_app_code 是全库唯一且不含 is_deleted(§17.2 原文),所以软删后的 code -- 仍被占用、不可复用(这层落地差额登记为问题单 P125,服务侧给可诊断文案而不是撞库 500)。 -- 非幂等:MySQL 5.7 无 ADD/CREATE IF NOT EXISTS 的评审友好写法(写了反而掩盖"表已存在但列不对"的漂移)。 -- 执行前先 `SHOW TABLES LIKE 'app_registry'` 确认不存在;存量:生产零存量(本表 T16 才建),无需回填。 -- ============================================================ CREATE TABLE `app_registry` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `app_code` VARCHAR(64) NOT NULL COMMENT '全局唯一人读 slug(C10 格式 ^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])$;保留字 form-center 不可注册)', `name` VARCHAR(128) NOT NULL COMMENT '应用显示名(入口链接要贴去 UserBase,名字与那边对照用)', `sch_id` BIGINT NOT NULL COMMENT '建立者会话校;0=平台级(仅超管可建,D14)', `is_deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删标记;名下存在 is_deleted=0 的表单行时禁删(§5.2 在用禁删)', `create_by` VARCHAR(255) DEFAULT NULL, `create_time` DATETIME DEFAULT NULL, `update_by` VARCHAR(255) DEFAULT NULL, `update_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_app_code` (`app_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='快应用注册表(契约 v2 §5.2:四业务字段、零角色、无审核;form.app_code 为逻辑引用不建 FK)'; -- 自验(执行后逐条核对,V59/V65): -- SHOW CREATE TABLE app_registry\G -- 应含 UNIQUE KEY `uk_app_code` (`app_code`),且列只有上面这些 -- SELECT COUNT(*) FROM information_schema.columns -- WHERE table_schema=DATABASE() AND table_name='app_registry' -- AND column_name REGEXP 'role|perm|admin|user_id'; -- 必须 0 行(V59 的机械判据)