/*
 Navicat Premium / MySQL 5.7+
 将 blade_region 的中国国家编码统一为 +86。

 适用场景：
 1. 旧数据使用 code = '00' 作为中国根节点；
 2. 旧数据使用 code = '86' 或 parent_code / ancestors = '86'；
 3. 当前数据没有国家根节点，但省级数据 parent_code 已经是 '86'。
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

START TRANSACTION;

-- 1. 确保新的中国国家节点存在。
INSERT INTO `blade_region` (
  `code`,
  `parent_code`,
  `ancestors`,
  `name`,
  `province_code`,
  `province_name`,
  `city_code`,
  `city_name`,
  `district_code`,
  `district_name`,
  `town_code`,
  `town_name`,
  `village_code`,
  `village_name`,
  `region_level`,
  `sort`,
  `remark`
)
SELECT
  '+86',
  '0',
  '0',
  COALESCE(
    (SELECT r.`name` FROM (SELECT `code`, `name` FROM `blade_region`) r WHERE r.`code` IN ('86', '00') ORDER BY FIELD(r.`code`, '86', '00') LIMIT 1),
    '中华人民共和国'
  ),
  '',
  '',
  '',
  '',
  '',
  '',
  '',
  '',
  '',
  '',
  0,
  1,
  ''
FROM DUAL
WHERE NOT EXISTS (
  SELECT 1 FROM (SELECT `code` FROM `blade_region` WHERE `code` = '+86') exists_region
);

-- 2. 如果 +86 已存在，仍强制修正它的根节点关系。
UPDATE `blade_region`
SET
  `parent_code` = '0',
  `ancestors` = '0',
  `region_level` = 0
WHERE `code` = '+86';

-- 3. 省级节点统一挂到 +86 下。
UPDATE `blade_region`
SET `parent_code` = '+86'
WHERE `parent_code` IN ('00', '86');

-- 4. ancestors 按逗号分隔 token 精确替换，避免误伤 110086 这类编码。
UPDATE `blade_region`
SET `ancestors` = TRIM(BOTH ',' FROM REPLACE(REPLACE(CONCAT(',', `ancestors`, ','), ',00,', ',+86,'), ',86,', ',+86,'))
WHERE FIND_IN_SET('00', `ancestors`) > 0
   OR FIND_IN_SET('86', `ancestors`) > 0;

-- 5. 清理旧中国根节点，避免树上出现多个国家根。
DELETE FROM `blade_region`
WHERE `code` IN ('00', '86')
  AND (`region_level` = 0 OR `name` IN ('中华人民共和国', '中国'));

COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

-- 验证：
-- SELECT `code`, `parent_code`, `ancestors`, `name`, `region_level` FROM `blade_region` WHERE `code` = '+86';
-- SELECT `code`, `parent_code`, `ancestors`, `name`, `region_level` FROM `blade_region` WHERE `parent_code` = '+86' ORDER BY `code` LIMIT 20;
-- SELECT `code`, `parent_code`, `ancestors`, `name` FROM `blade_region` WHERE `parent_code` IN ('00', '86') OR FIND_IN_SET('00', `ancestors`) > 0 OR FIND_IN_SET('86', `ancestors`) > 0;
