Files
tms-erp-api/doc/sql/transport/blade_region_plus86_migration.sql
2026-07-21 13:16:10 +08:00

94 lines
2.4 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
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;