跳到主要内容

五个区合区教程

合区目的

将五个分区的角色数据合并到一个综合区中,确保数据唯一性和一致性。


合区 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 '[五区]%';

注意事项

  1. 冲突处理
    • 确保 charid 是唯一主键,避免合区后 ID 冲突。
  2. 性能优化
    • 大数据量时,分批处理(如每次 1 万条)。
  3. 外键约束
    • UNIONIDSEPTID 是外键,需同步更新关联表。
  4. 数据安全
    • 合区前后均需验证数据正确性。
  5. 事务支持
    • 使用事务确保操作的原子性。