zhibo/完整修复直播间主播关联.sql
2026-01-03 15:32:31 +08:00

236 lines
6.1 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;