-- 适用:升级到独立社交身份表的既有 PIGX 数据库。 -- 执行前备份,并通过 mysql 的 --database 指定 pigxx 或 pigxx_boot;不要对业务库重跑初始化脚本。 -- 保留 sys_user 旧字段;仅迁移当前仍支持的平台。重复执行不会覆盖已经绑定的身份。 -- 若同一身份绑定多个用户,或用户已有不同身份,唯一索引将阻止迁移并回滚数据,请先核对冲突。 CREATE TABLE IF NOT EXISTS `sys_user_social` ( `id` bigint(20) NOT NULL COMMENT '主键ID', `user_id` bigint(20) NOT NULL COMMENT '用户ID', `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '社交平台类型', `identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一凭据', `create_time` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `uk_social_identifier` (`type`,`identifier`) USING BTREE, UNIQUE KEY `uk_user_social_type` (`user_id`,`type`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户社交登录身份表'; DROP PROCEDURE IF EXISTS pigx_migrate_user_social_20260922; DELIMITER $$ CREATE PROCEDURE pigx_migrate_user_social_20260922() BEGIN DECLARE platform_index INT DEFAULT 0; DECLARE legacy_column VARCHAR(32); DECLARE platform_type VARCHAR(32); DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; RESIGNAL; END; START TRANSACTION; WHILE platform_index < 5 DO SET legacy_column = ELT(platform_index + 1, 'wx_openid', 'mini_openid', 'qq_openid', 'wx_cp_userid', 'wx_ding_userid'); SET platform_type = ELT(platform_index + 1, 'WX', 'MINI', 'QQ', 'WEIXIN_CP', 'DINGTALK'); IF EXISTS ( SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_user' AND COLUMN_NAME = legacy_column ) THEN SET @pigx_social_migration_sql = CONCAT( 'INSERT INTO sys_user_social (id, user_id, type, identifier, create_time) ', 'SELECT UUID_SHORT(), u.user_id, ', QUOTE(platform_type), ', u.`', legacy_column, '`, NOW() ', 'FROM sys_user u WHERE u.`', legacy_column, '` IS NOT NULL ', 'AND TRIM(u.`', legacy_column, '`) <> ', QUOTE(''), ' ', 'AND NOT EXISTS (SELECT 1 FROM sys_user_social s WHERE s.user_id = u.user_id ', 'AND s.type = ', QUOTE(platform_type), ' AND BINARY s.identifier = BINARY u.`', legacy_column, '`)' ); PREPARE pigx_social_migration_stmt FROM @pigx_social_migration_sql; EXECUTE pigx_social_migration_stmt; DEALLOCATE PREPARE pigx_social_migration_stmt; END IF; SET platform_index = platform_index + 1; END WHILE; COMMIT; END$$ DELIMITER ; CALL pigx_migrate_user_social_20260922(); DROP PROCEDURE pigx_migrate_user_social_20260922; SET @pigx_social_migration_sql = NULL;