This commit is contained in:
2026-07-21 13:16:10 +08:00
parent f13963f5b8
commit af06f725fa
28 changed files with 406 additions and 135 deletions

View File

@@ -0,0 +1,93 @@
/*
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;