SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

USE hyapp_user;

-- 该表只保留 2026-07-22 语义调整前已经产生的匿名访问记录，供列表兼容读取；
-- 新匿名访问不再写事实。继续保留表结构可保证滚动升级与历史数据读取，不需要执行高风险删表或回填：
-- 1. CREATE TABLE 不扫描、复制或锁住旧访问表，迁移成本与旧表数据量无关；
-- 2. 旧表中的所有历史记录继续作为公开访问返回，不会因用户当前 VIP 状态被倒推改写；
-- 3. 主键服务单 target/visitor 的幂等累计，target_time 索引服务目标用户分页，查询不扫全表。
CREATE TABLE IF NOT EXISTS user_profile_anonymous_visits (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  target_user_id BIGINT NOT NULL COMMENT '目标用户 ID',
  visitor_user_id BIGINT NOT NULL COMMENT '仅 user-service 内部用于聚合的真实访客 ID，禁止对外返回',
  anonymous_visit_id VARCHAR(64) NOT NULL COMMENT '首次匿名访问生成的随机展示 ID，不包含真实用户信息',
  visit_count BIGINT NOT NULL DEFAULT 1 COMMENT '匿名阶段累计访问数量',
  first_visited_at_ms BIGINT NOT NULL COMMENT '首次匿名访问时间，UTC epoch ms',
  last_visited_at_ms BIGINT NOT NULL COMMENT '最后匿名访问时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, target_user_id, visitor_user_id),
  UNIQUE KEY uk_user_profile_anonymous_visit_id (app_code, target_user_id, anonymous_visit_id),
  KEY idx_user_profile_anonymous_visits_target_time (app_code, target_user_id, last_visited_at_ms, anonymous_visit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户资料匿名访问 owner 表';

-- CREATE TABLE IF NOT EXISTS 不会为试运行阶段已存在的表补索引；唯一约束和目标时间分页索引都必须
-- 独立收敛。两个 DDL 只访问新匿名表，不读取或锁住旧 user_profile_visits 热表；若已有重复随机 ID，
-- 唯一键构建会直接失败，由部署方先审计异常数据，不能静默合并两个匿名身份。
SET @ddl := IF(
  (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'user_profile_anonymous_visits' AND INDEX_NAME = 'uk_user_profile_anonymous_visit_id') = 0,
  'ALTER TABLE user_profile_anonymous_visits ADD UNIQUE INDEX uk_user_profile_anonymous_visit_id (app_code, target_user_id, anonymous_visit_id), ALGORITHM=INPLACE, LOCK=NONE',
  'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @ddl := IF(
  (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'user_profile_anonymous_visits' AND INDEX_NAME = 'idx_user_profile_anonymous_visits_target_time') = 0,
  'ALTER TABLE user_profile_anonymous_visits ADD INDEX idx_user_profile_anonymous_visits_target_time (app_code, target_user_id, last_visited_at_ms, anonymous_visit_id), ALGORITHM=INPLACE, LOCK=NONE',
  'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
