最新的省市区三级地区MySQL数据库
想要直接拿MySQL地区sql⽂件的,直接跳到⽂章末尾获取
前⾔
之前也写过类似的获取⽅式,是从国家统计局获取5级地区信息,⽅法也⽐较⿇烦,在实际使⽤过程中,也很少遇到要精确到5级的情况,所以,这次就更新⼀下,如何获取三级地区信息。
1、获取数据
进⼊⾼德地图的官⽹,下载到我们需要的数据:⾼德地图官⽹
我当时的获取位置是:开发⽀持==>web端==>地图JS API,拉到最下⾯,就能看到相关下载链接,点击后,就是上⾯图⽚的位置。
下载后,将得到⼀个citycode.xlsx的Excel⽂档,这个⽂档不能直接使⽤,需要做⼀下转换,将Excel变成csv⽂件,才能做进⼀步的操作。
2、数据处理
在Windows电脑上,将上⾯的citycode.xlsx⽂件打开,另存为csv⽂件,注意是逗号分隔的;
最后还需要调整⼀下编码格式,可以⽤记事本等⼯具把导出的citycode.csv⽂件打开,重新保存⼀下,保存的时候,选择UTF-8的中⽂编码格式,得到最后的citycode2.csv⽂件;
做完上述的步骤之后,就可以导⼊到数据库中了,关于如何导⼊,有两种⽅式:
⼀、参照我之前写的⼀篇博⽂:MySQL导⼊导出csv⽂件,⽤命令导⼊
⼆、⽤Navcat⼯具导⼊,步骤如下:
1、选择⼀个数据库,在table选项上右键==>Import Wizard
x86所有减法指令
2、选择CSV File(*.csv),点击Next
3、Improt From选择我们上⾯的citycode2.csv,编码格式UTF-8(65001)
4、选择⾏分隔符为CRLF(Windows系统⽤的是这个,鉴于我们导出的CSV⽂件也是office导出的,office⼜是运⾏在Windows上的,所以这⾥不会有变化),分隔符⽤默认的逗号,如果不放⼼,⾃⼰再打⼀个英⽂逗号
5、之后就可以⼀直下⼀步了,最后确认导⼊。
6、最后,我们得到⼀张citycode2的数据库表,如下:
3、信息整理
我们拿到的这么⼀张数据库表,并不能直接使⽤,像地区等级,上下级等等的信息都没有,所以还需要加⼯处理⼀下才能使⽤
我这边是写了⼀个函数,将数据全部清理了⼀遍,导⼊到新的地区表中了,下⾯是新建的数据库表,以及我编写的函数:
CREATE TABLE `sys_position` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`area_name` varchar(255) DEFAULT NULL COMMENT '地区名称',
`area_code` int(11) DEFAULT NULL COMMENT '地区编码',
`city_code` varchar(11) DEFAULT NULL COMMENT '城市编码',
`level` tinyint(1) DEFAULT NULL COMMENT '地区等级',
`area_index` varchar(255) DEFAULT NULL COMMENT '地区索引',
PRIMARY KEY (`id`)
sql索引有几种) ENGINE=InnoDB AUTO_INCREMENT=3537 DEFAULT CHARSET=utf8mb4;
drop function if exists create_city;
delimiter $$
create function create_city(provinceCode varchar(11))
returns varchar(20)
vbfor循环语句图案例题begin
declare intProvinceCode int(11);
declare intCityCode int(11);
mysql面试题导图declare loopTimes int(11) default 0;
declare areaCityCode varchar(11);
declare i int(11);
declare tempPage int(11) default 0;
declare countyIndex varchar(36);
set intProvinceCode = CONVERT(provinceCode,SIGNED);
-- 当前省下⾯有多少个市
select COUNT(1) into loopTimes from citycode2 where adcode between intProvinceCode and intProvinceCode+10000 and
束而氨基酸洗面奶substring(adcode,3) != "0000" and substring(adcode,5) ="00";
SET i = 1;
-- 1.1先插⼊市的数据
insert into sys_position (area_name,area_code,city_code,`level`)
select area_name,adcode,citycode,2 from citycode2
where adcode between intProvinceCode and intProvinceCode+10000 and substring(adcode,3) != "0000" and substring(adcode,5) ="00"; -- 1.2补充市的上级地区索引
update sys_position set area_index=provinceCode where area_code between intProvinceCode and intProvinceCode+10000
and substring(area_code,3) != "0000" and substring(area_code,5) ="00";
-- 2循环更新县的数据
WHILE i <= loopTimes DO
SET tempPage = i-1;
-- 2.1获取市的编码
select adcode into areaCityCode from citycode2 where adcode between intProvinceCode and intPro
vinceCode+10000 and
substring(adcode,3) != "0000" and substring(adcode,5) ="00" limit tempPage,1;
SET intCityCode = CONVERT(CONCAT(substring(areaCityCode,3,2),"00"),SIGNED);
SET intCityCode = intProvinceCode+intCityCode;
-- 2.2插⼊县的数据
insert into sys_position (area_name,area_code,city_code,`level`)
select area_name,adcode,citycode,3 from citycode2
where adcode between intCityCode and intCityCode+100 and substring(adcode,3) != "0000" and substring(adcode,5) !="00";
-- 2.3补充县的上级地区索引这⾥需要循环取出
SET countyIndex = CONCAT(provinceCode,",",areaCityCode);
update sys_position set area_index=countyIndex
where area_code between intCityCode and intCityCode+100 and substring(area_code,3) != "0000" and substring(area_code,5) !="00"; SET i = i + 1;
END WHILE;webgl入门
-- 补处理没有市信息,直接是区级别的
-- 3.1 如果省下⾯⼀个市(5-6位是0)也没有将区级别的直接归为市
IF loopTimes = 0 THEN
insert into sys_position (area_name,area_code,city_code,`level`,area_index)
select area_name,adcode,citycode,2,provinceCode from citycode2
where adcode between intProvinceCode and intProvinceCode+10000 and substring(adcode,3) != "0000";
-- 3.2 如果是省,取上述循环结束后的地区编码,表格是按照数字增长的,所以将没有上级市的“市”也划为市
ELSE
insert into sys_position (area_name,area_code,city_code,`level`,area_index)
select area_name,adcode,citycode,2,provinceCode from citycode2
where adcode between intCityCode+100 and intProvinceCode+10000 and substring(adcode,3) != "0000";
END IF;
return 'hello';
end$$
delimiter ;
最后执⾏了⼀条sql语句:
select create_city(adcode) from citycode2 where substring(adcode,3)="0000" and adcode!="100000" and adcode!="900000"
函数的内容有点复杂,这⾥就不详细去讲解了,有兴趣的⼈可以分析⼀下
另外需要补充的⼀点是,从原表到新表,少了1条数据,我检查了很久也不知道是哪⾥出了问题,由于影响很⼩,我这⾥也就没管了,有⼩伙伴看完之后,帮忙修复上述函数的漏洞或者补充出来这1条数据,也是极好的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。