-- ============================================================ -- pbl_domain_ext (M8 基础域薄扩展 world/scene/entity) -- 唯一新增表:pbl_domain_ref(关联表,三类关联共用,靠 ref_type 区分) -- 基表 world / scene / entity 由各自基础模块负责,本文件零建表、零写入。 -- 列名与 models/pbl_domain_ref.json、pbl_domain_ext/base.py FIELD_MAXLEN -- 三处同名同型(tests/test_models_contract.py 机械校验)。 -- 审计列采用设计 §J1 权威列名 creator_id / updater_id / bind_at / ext_json, -- 历史版本曾使用 created_by / updated_by 旧名,已废弃(禁用列名由契约测试将守)。 -- ============================================================ CREATE TABLE IF NOT EXISTS `pbl_domain_ref` ( `id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键ID', `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '租户ID', `ref_type` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '关联类型(world/scene/entity)', `ref_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '基础域对象ID', `ref_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '基础域对象编码', `ref_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '基础域对象名称', `blueprint_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'PBL蓝图ID', `team_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '团队ID', `class_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '班级ID', `bind_state` VARCHAR(32) NOT NULL DEFAULT 'bound' COMMENT '绑定状态(bound/unbound)', `bind_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '绑定时间', `remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注', `ext_json` TEXT NULL COMMENT '扩展属性JSON(设计§J1权威列名)', `creator_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '创建人ID', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '更新人ID', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `is_deleted` VARCHAR(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标记(0正常/1已删)', PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_domain_ref_bind` (`tenant_id`, `ref_type`, `ref_id`), KEY `idx_pbl_domain_ref_tenant_type` (`tenant_id`, `ref_type`, `is_deleted`), KEY `idx_pbl_domain_ref_blueprint` (`tenant_id`, `blueprint_id`), KEY `idx_pbl_domain_ref_team` (`tenant_id`, `class_id`, `team_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL基础域关联表(world/scene/entity)'; -- ------------------------------------------------------------ -- 存量库幂等迁移(仅在已建过旧版本表的库上手工执行;新库跑上面的 CREATE 即可) -- 策略:RENAME 保数据,不 DROP 重建;重复执行安全(先查 information_schema)。 -- -- SET @c = (SELECT COUNT(*) FROM information_schema.COLUMNS -- WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pbl_domain_ref' -- AND COLUMN_NAME='created_by'); -- SET @s = IF(@c>0, 'ALTER TABLE `pbl_domain_ref` CHANGE COLUMN `created_by` `creator_id` VARCHAR(32) NOT NULL DEFAULT "" COMMENT "创建人ID"', 'SELECT "creator_id ok"'); -- PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st; -- -- SET @c = (SELECT COUNT(*) FROM information_schema.COLUMNS -- WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pbl_domain_ref' -- AND COLUMN_NAME='updated_by'); -- SET @s = IF(@c>0, 'ALTER TABLE `pbl_domain_ref` CHANGE COLUMN `updated_by` `updater_id` VARCHAR(32) NOT NULL DEFAULT "" COMMENT "更新人ID"', 'SELECT "updater_id ok"'); -- PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st; -- -- SET @c = (SELECT COUNT(*) FROM information_schema.COLUMNS -- WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pbl_domain_ref' -- AND COLUMN_NAME='bind_at'); -- SET @s = IF(@c=0, 'ALTER TABLE `pbl_domain_ref` ADD COLUMN `bind_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "绑定时间" AFTER `bind_state`', 'SELECT "bind_at ok"'); -- PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st; -- ------------------------------------------------------------