📋 表概述

mail_server_character 表记录了哪些角色已经接收过某封服务端自动邮件,用于防止重复发送。每条记录将角色 GUID 与邮件模板 ID 关联,确保同一模板邮件不会重复发送给同一角色。

联合主键为 (guid, mailId),确保每个角色只记录一次同一模板邮件的接收。通过外键 fk_mail_server_character 关联 mail_server_template 表。

📊 表结构

字段名类型默认值说明
guidint UNSIGNEDNOT NULL角色全局唯一ID(characters.guid)
mailIdint UNSIGNEDNOT NULL邮件模板ID(外键→mail_server_template.id)

🔍 重要字段详解

🆔 guid / mailId - 联合主键

详细说明:两个字段组成联合主键,形成唯一的"角色-邮件"配对。
  • guid - 角色的GUID,关联 characters 表
  • mailId - 邮件模板ID,关联 mail_server_template.id
  • 唯一性保证:同一角色不会重复记录同一模板
  • 不能单独插入重复的(guid, mailId)组合

🔗 外键级联删除 (CASCADE)

详细说明:该表设置了外键约束 FOREIGN KEY (mailId) → mail_server_template(id),且使用了 ON DELETE CASCADE。
  • 级联删除:删除模板后,所有关联记录自动清除
  • 数据一致性:不会出现孤立记录
  • 删除一个模板 ID=3 的邮件模板 → 自动删除该表中所有 mailId=3 的记录
💡 注意:删除模板会清除所有历史发送记录,意味着相关角色可能再次收到该邮件(如果条件仍然满足)。

🔄 使用场景

详细说明:服务端检查角色登录时,对启用的邮件模板逐一判断:
  • 1. 检查 mail_server_template_conditions 条件是否满足
  • 2. 检查 mail_server_character 是否已有发送记录
  • 3. 若条件满足且无记录 → 发送邮件并写入该表
  • 4. 若有记录 → 跳过,不重复发送

💡 SQL示例

示例1:查询某角色已接收的所有模板邮件

SELECT t.id AS template_id, t.subject, FLOOR(t.moneyA / 10000) AS alliance_gold, FLOOR(t.moneyH / 10000) AS horde_gold FROM mail_server_character mc JOIN mail_server_template t ON t.id = mc.mailId WHERE mc.guid = 100;

示例2:清除某角色的发送记录(允许重新发送)

-- 删除角色GUID=100的模板1发送记录 DELETE FROM mail_server_character WHERE guid = 100 AND mailId = 1;

示例3:统计各模板邮件的发送数量

SELECT mc.mailId, t.subject, COUNT(*) AS sent_count FROM mail_server_character mc JOIN mail_server_template t ON t.id = mc.mailId GROUP BY mc.mailId, t.subject ORDER BY sent_count DESC;

❓ 常见问题

Q1: 如何让某个角色重新收到某封服务端邮件?
mail_server_character 表中删除该角色对应的记录即可:DELETE FROM mail_server_character WHERE guid = X AND mailId = Y;。之后角色再次满足条件时会重新收信。
Q2: 该表会影响游戏性能吗?
影响极小。该表只在角色登录时做一次查询(检查是否有发送记录),数据量通常很小。外键索引确保了查询效率。