236 lines
6.1 KiB
SQL
236 lines
6.1 KiB
SQL
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;
|