Files
pigx/db/upgrade/20260922_user_social.sql
T

59 lines
3.0 KiB
SQL

-- 适用:升级到独立社交身份表的既有 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;