五个区合区教程
合区目的
将五个分区的角色数据合并到一个综合区中,确保数据唯一性和一致性。
合区 SQL 语句
1. 合区时统一编号(加上区号前缀)
为每个分区的角色 ID 添加区号前缀,避免合区后 ID 冲突。
-- 一区示例:原 charid=123 → 新 charid=10000123
UPDATE `zt1`.CHARBASE SET charid = charid + 10000; -- 一区前缀为 10000
-- 二区示例:原 charid=123 → 新 charid=20000123
UPDATE `zt2`.CHARBASE SET charid = charid + 20000; -- 二区前缀为 20000
-- 三区示例:原 charid=123 → 新 charid=30000123
UPDATE `zt3`.CHARBASE SET charid = charid + 30000; -- 三区前缀为 30000
-- 四区示例:原 charid=123 → 新 charid=40000123
UPDATE `zt4`.CHARBASE SET charid = charid + 40000; -- 四区前缀为 40000
-- 五区示例:原 charid=123 → 新 charid=50000123
UPDATE `zt5`.CHARBASE SET charid = charid + 50000; -- 五区前缀为 50000
2. 合区前角色处理(清空家族帮会 + 添加前缀)
清空角色的家族和帮会信息,并为角色名称添加分区前缀。
-- 一区
UPDATE `zt1`.CHARBASE
SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[一区]', NAME);
-- 二区
UPDATE `zt2`.CHARBASE
SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[二区]', NAME);
-- 三区
UPDATE `zt3`.CHARBASE
SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[三区]', NAME);
-- 四区
UPDATE `zt4`.CHARBASE
SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[四区]', NAME);
-- 五区
UPDATE `zt5`.CHARBASE
SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[五区]', NAME);
3. 将角色数据插入综合区
将五个分区的角色数据插入到综合区(zt0
)。
-- 插入一区数据
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt1`.CHARBASE;
-- 插入二区数据
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt2`.CHARBASE;
-- 插入三区数据
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt3`.CHARBASE;
-- 插入四区数据
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt4`.CHARBASE;
-- 插入五区数据
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt5`.CHARBASE;
完整操作流程
1. 备份数据
-- 备份五个分区的数据
CREATE TABLE `zt1`.CHARBASE_BACKUP SELECT * FROM `zt1`.CHARBASE;
CREATE TABLE `zt2`.CHARBASE_BACKUP SELECT * FROM `zt2`.CHARBASE;
CREATE TABLE `zt3`.CHARBASE_BACKUP SELECT * FROM `zt3`.CHARBASE;
CREATE TABLE `zt4`.CHARBASE_BACKUP SELECT * FROM `zt4`.CHARBASE;
CREATE TABLE `zt5`.CHARBASE_BACKUP SELECT * FROM `zt5`.CHARBASE;
-- 备份综合区数据
CREATE TABLE `zt0`.CHARBASE_BACKUP SELECT * FROM `zt0`.CHARBASE;
2. 执行合区操作
BEGIN TRANSACTION;
-- 更新五个区的角色ID
UPDATE `zt1`.CHARBASE SET charid = charid + 10000;
UPDATE `zt2`.CHARBASE SET charid = charid + 20000;
UPDATE `zt3`.CHARBASE SET charid = charid + 30000;
UPDATE `zt4`.CHARBASE SET charid = charid + 40000;
UPDATE `zt5`.CHARBASE SET charid = charid + 50000;
-- 清空家族帮会并加前缀
UPDATE `zt1`.CHARBASE SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[一区]', NAME);
UPDATE `zt2`.CHARBASE SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[二区]', NAME);
UPDATE `zt3`.CHARBASE SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[三区]', NAME);
UPDATE `zt4`.CHARBASE SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[四区]', NAME);
UPDATE `zt5`.CHARBASE SET UNIONID = 0, SEPTID = 0, NAME = CONCAT('[五区]', NAME);
-- 插入数据到综合区
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt1`.CHARBASE;
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt2`.CHARBASE;
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt3`.CHARBASE;
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt4`.CHARBASE;
INSERT INTO `zt0`.CHARBASE SELECT * FROM `zt5`.CHARBASE;
COMMIT;
3. 验证数据
-- 检查各分区角色是否成功迁移
SELECT COUNT(*) FROM `zt0`.CHARBASE WHERE NAME LIKE '[一区]%';
SELECT COUNT(*) FROM `zt0`.CHARBASE WHERE NAME LIKE '[二区]%';
SELECT COUNT(*) FROM `zt0`.CHARBASE WHERE NAME LIKE '[三区]%';
SELECT COUNT(*) FROM `zt0`.CHARBASE WHERE NAME LIKE '[四区]%';
SELECT COUNT(*) FROM `zt0`.CHARBASE WHERE NAME LIKE '[五区]%';
注意事项
- 冲突处理:
- 确保
charid
是唯一主键,避免合区后 ID 冲突。
- 确保
- 性能优化:
- 大数据量时,分批处理(如每次 1 万条)。
- 外键约束:
- 若
UNIONID
或SEPTID
是外键,需同步更新关联表。
- 若
- 数据安全:
- 合区前后均需验证数据正确性。
- 事务支持:
- 使用事务确保操作的原子性。