mail_server_character - 角色已收服务端邮件记录
基于 AzerothCore Characters 数据库 · 服务端邮件发送防重复记录表
📋 表概述
mail_server_character 表记录了哪些角色已经接收过某封服务端自动邮件,用于防止重复发送。每条记录将角色 GUID 与邮件模板 ID 关联,确保同一模板邮件不会重复发送给同一角色。
- 防重复发送记录
- 角色-模板关联
- 外键级联删除
- 生命周期管理
联合主键为 (guid, mailId),确保每个角色只记录一次同一模板邮件的接收。通过外键
fk_mail_server_character 关联 mail_server_template 表。📊 表结构
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guid | int UNSIGNED | NOT NULL | 角色全局唯一ID(characters.guid) |
| mailId | int UNSIGNED | NOT 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: 该表会影响游戏性能吗?
影响极小。该表只在角色登录时做一次查询(检查是否有发送记录),数据量通常很小。外键索引确保了查询效率。