zhibo/完整修复直播间主播关联.sql

236 lines
6.1 KiB
MySQL
Raw Normal View History

2026-01-03 15:32:31 +08:00
USE zhibo;
-- ==========================================
-- 修复直播间主播关联 - 完整方案
-- ==========================================
-- 步骤1: 查看当前情况
SELECT '========== 当前数据情况 ==========' as info;
-- 查看有多少主播
SELECT
'认证主播数量' as item,
COUNT(*) as count
FROM eb_user
WHERE is_streamer = 1;
-- 查看直播间情况
SELECT
'总直播间数' as item,
COUNT(*) as count
FROM eb_live_room
UNION ALL
SELECT
'uid为空或0的直播间' as item,
COUNT(*) as count
FROM eb_live_room
WHERE uid IS NULL OR uid = 0
UNION ALL
SELECT
'uid无效的直播间(用户不存在)' as item,
COUNT(*) as count
FROM eb_live_room
WHERE uid IS NOT NULL AND uid > 0 AND uid NOT IN (SELECT uid FROM eb_user);
-- 步骤2: 选择一个默认主播
-- 优先选择有最多关注记录的主播
SELECT '========== 选择默认主播 ==========' as info;
SELECT
u.uid,
u.nickname,
u.phone,
u.is_streamer,
COUNT(fr.id) as follower_count
FROM eb_user u
LEFT JOIN eb_follow_record fr ON fr.followed_id = u.uid AND fr.follow_status = '关注'
WHERE u.is_streamer = 1
GROUP BY u.uid, u.nickname, u.phone, u.is_streamer
ORDER BY follower_count DESC, u.uid ASC
LIMIT 5;
-- 使用第一个主播作为默认主播uid=318 根据之前的数据)
SET @default_streamer_id = (
SELECT u.uid
FROM eb_user u
WHERE u.is_streamer = 1
ORDER BY u.uid ASC
LIMIT 1
);
SELECT CONCAT('默认主播ID: ', @default_streamer_id) as info;
-- 获取默认主播的昵称
SET @default_streamer_name = (
SELECT nickname
FROM eb_user
WHERE uid = @default_streamer_id
);
SELECT CONCAT('默认主播昵称: ', @default_streamer_name) as info;
-- 步骤3: 修复所有无效的直播间
SELECT '========== 开始修复直播间数据 ==========' as info;
-- 3.1 修复 uid 为空或0的直播间
UPDATE eb_live_room
SET uid = @default_streamer_id,
streamer_name = @default_streamer_name
WHERE uid IS NULL OR uid = 0;
SELECT CONCAT('已修复 uid 为空或0的直播间: ', ROW_COUNT(), '') as result;
-- 3.2 修复 uid 指向不存在用户的直播间
UPDATE eb_live_room
SET uid = @default_streamer_id,
streamer_name = @default_streamer_name
WHERE uid IS NOT NULL
AND uid > 0
AND uid NOT IN (SELECT uid FROM eb_user);
SELECT CONCAT('已修复 uid 无效的直播间: ', ROW_COUNT(), '') as result;
-- 步骤4: 验证修复结果
SELECT '========== 修复结果验证 ==========' as info;
SELECT
'总直播间数' as item,
COUNT(*) as count
FROM eb_live_room
UNION ALL
SELECT
'uid有效的直播间' as item,
COUNT(*) as count
FROM eb_live_room
WHERE uid IN (SELECT uid FROM eb_user)
UNION ALL
SELECT
'uid无效的直播间' as item,
COUNT(*) as count
FROM eb_live_room
WHERE uid NOT IN (SELECT uid FROM eb_user);
-- 步骤5: 查看修复后的直播间样例
SELECT '========== 修复后的直播间样例 ==========' as info;
SELECT
r.id,
r.uid,
u.nickname as actual_streamer_name,
r.streamer_name as room_streamer_name,
r.title,
r.is_live,
r.create_time
FROM eb_live_room r
LEFT JOIN eb_user u ON r.uid = u.uid
ORDER BY r.id DESC
LIMIT 10;
-- 步骤6: 添加外键约束(可选,确保数据一致性)
-- 注意:添加外键前必须确保所有数据都有效
SELECT '========== 添加外键约束 ==========' as info;
-- 检查是否已存在外键
SELECT
CONSTRAINT_NAME,
CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = 'zhibo'
AND TABLE_NAME = 'eb_live_room'
AND CONSTRAINT_TYPE = 'FOREIGN KEY';
-- 如果没有外键,添加外键约束
-- ALTER TABLE eb_live_room
-- ADD CONSTRAINT fk_live_room_user
-- FOREIGN KEY (uid) REFERENCES eb_user(uid)
-- ON DELETE CASCADE
-- ON UPDATE CASCADE;
SELECT '提示: 外键约束已注释,如需启用请手动执行' as info;
-- 步骤7: 创建触发器确保新建直播间时uid必须有效可选
SELECT '========== 创建验证触发器 ==========' as info;
DELIMITER $$
DROP TRIGGER IF EXISTS before_live_room_insert$$
CREATE TRIGGER before_live_room_insert
BEFORE INSERT ON eb_live_room
FOR EACH ROW
BEGIN
DECLARE user_exists INT;
-- 检查uid是否为空
IF NEW.uid IS NULL OR NEW.uid = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '直播间必须指定有效的主播ID';
END IF;
-- 检查用户是否存在
SELECT COUNT(*) INTO user_exists
FROM eb_user
WHERE uid = NEW.uid;
IF user_exists = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '指定的主播用户不存在';
END IF;
-- 检查用户是否是认证主播
SELECT COUNT(*) INTO user_exists
FROM eb_user
WHERE uid = NEW.uid AND is_streamer = 1;
IF user_exists = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '只有认证主播才能创建直播间';
END IF;
END$$
DROP TRIGGER IF EXISTS before_live_room_update$$
CREATE TRIGGER before_live_room_update
BEFORE UPDATE ON eb_live_room
FOR EACH ROW
BEGIN
DECLARE user_exists INT;
-- 如果uid被修改进行验证
IF NEW.uid != OLD.uid THEN
-- 检查uid是否为空
IF NEW.uid IS NULL OR NEW.uid = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '直播间必须指定有效的主播ID';
END IF;
-- 检查用户是否存在
SELECT COUNT(*) INTO user_exists
FROM eb_user
WHERE uid = NEW.uid;
IF user_exists = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '指定的主播用户不存在';
END IF;
END IF;
END$$
DELIMITER ;
SELECT '触发器创建完成' as info;
-- 步骤8: 最终统计
SELECT '========== 最终统计 ==========' as info;
SELECT
u.uid,
u.nickname,
COUNT(r.id) as room_count,
SUM(CASE WHEN r.is_live = 1 THEN 1 ELSE 0 END) as live_room_count
FROM eb_user u
LEFT JOIN eb_live_room r ON r.uid = u.uid
WHERE u.is_streamer = 1
GROUP BY u.uid, u.nickname
ORDER BY room_count DESC;
SELECT '========== 修复完成 ==========' as info;