root/kladr/sql/kladr2mysql.sql

Revision 54, 7.0 kB (checked in by teiko, 4 years ago)

Более удачные индексы и побавлено поле корпуса к таблице домов

Line 
1
2 -- ��������CREATE TABLE types(
3     id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
4     short_name VARCHAR(10) NOT NULL,
5     name VARCHAR(40) NOT NULL,
6     INDEX (short_name)
7 ) TYPE = innodb;
8 INSERT INTO types(short_name, name)
9     SELECT DISTINCT scname, socrname FROM SOCRBASE;
10
11
12 -- ������CREATE TABLE regions (
13    id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
14    name VARCHAR(40) NOT NULL,
15    type INT(1) UNSIGNED NOT NULL,
16    _index CHAR(6) NOT NULL,
17    code CHAR(2) NOT NULL,
18    INDEX (name),
19    INDEX (type),
20    UNIQUE INDEX (code)
21 ) TYPE = innodb;
22 INSERT INTO regions(name, type, _index, code)
23     SELECT KLADR.name, types.id, _index, LEFT(code,2)
24     FROM KLADR
25         INNER JOIN types ON KLADR.socr = types.short_name
26     WHERE RIGHT(code,11)="00000000000";
27
28 -- �����
29 CREATE TABLE zones (
30    id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
31    name VARCHAR(40) NOT NULL,
32    type INT(1) UNSIGNED NOT NULL,
33    _index CHAR(6) NOT NULL,
34    parent_region INT(1) UNSIGNED NULL,
35    code CHAR(5) NOT NULL,
36    INDEX (name),
37    INDEX (type),
38    UNIQUE INDEX (code),
39    INDEX (parent_region)
40 ) TYPE = innodb;
41 INSERT INTO zones(name, type, _index, code)
42     SELECT KLADR.name, types.id, _index, LEFT(code,5)
43     FROM KLADR
44         INNER JOIN types ON KLADR.socr = types.short_name
45     WHERE RIGHT(code,8)="00000000" AND SUBSTRING(code,3,3) <>"000";
46 UPDATE zones SET parent_region = (SELECT id FROM regions WHERE code = LEFT(zones.code,2));
47
48
49 CREATE TABLE cities (
50    id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
51    name VARCHAR(40) NOT NULL,
52    type INT(1) UNSIGNED NOT NULL,
53    _index CHAR(6) NOT NULL,
54    parent_region INT(1) UNSIGNED NULL,
55    parent_zone INT(1) UNSIGNED NULL,
56    code CHAR(8) NOT NULL,
57    INDEX (name),
58    INDEX (type),
59    UNIQUE INDEX (code),
60    INDEX (parent_region),
61    INDEX (parent_zone)
62 ) TYPE = innodb;
63 INSERT INTO cities(name, type, _index, code)
64     SELECT KLADR.name, types.id, _index, LEFT(code,8)
65     FROM KLADR
66         INNER JOIN types ON KLADR.socr = types.short_name
67     WHERE RIGHT(code,5)="00000" AND SUBSTRING(code, 6, 3)<>"000";
68 UPDATE cities SET parent_region = (SELECT id FROM regions WHERE code = LEFT(cities.code,2));
69 UPDATE cities SET parent_zone = (SELECT id FROM zones WHERE code = LEFT(cities.code,5));
70
71 -- ������ ���CREATE TABLE settlements (
72    id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
73    name VARCHAR(40) NOT NULL,
74    type INT(1) UNSIGNED NOT NULL,
75    _index CHAR(6) NOT NULL,
76    parent_region INT(1) UNSIGNED NULL,
77    parent_zone INT(1) UNSIGNED NULL,
78    parent_city INT(1) UNSIGNED NULL,
79    code CHAR(11) NOT NULL,
80    INDEX (name),
81    INDEX (type),
82    UNIQUE INDEX (code),
83    INDEX (parent_region),
84    INDEX (parent_zone),
85    INDEX (parent_city)
86 ) TYPE = innodb;
87 INSERT LOW_PRIORITY INTO settlements(name, type, _index, code)
88     SELECT SQL_BIG_RESULT KLADR.name, types.id, _index, LEFT(code,11)
89     FROM KLADR
90         INNER JOIN types ON KLADR.socr = types.short_name
91     WHERE RIGHT(code,2)="00" AND SUBSTRING(code, 9, 3)<>"000";
92 UPDATE settlements SET parent_region = (SELECT id FROM regions WHERE code = LEFT(settlements.code,2));
93 UPDATE settlements SET parent_zone = (SELECT id FROM zones WHERE code = LEFT(settlements.code,5));
94 UPDATE settlements SET parent_city = (SELECT id FROM cities WHERE code = LEFT(settlements.code,8));
95
96 -- ����
97 CREATE TABLE streets (
98    id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
99    name VARCHAR(40) NOT NULL,
100    type INT(1) UNSIGNED NOT NULL,
101    _index CHAR(6) NOT NULL,
102    parent_region INT(1) UNSIGNED NULL,
103    parent_city INT(1) UNSIGNED NULL,
104    parent_settlement INT(1) UNSIGNED NULL,
105    code CHAR(15) NOT NULL,
106    INDEX (name),
107    INDEX (type),
108    UNIQUE INDEX (code),
109    INDEX (parent_region, parent_city, parent_settlement, name),
110    INDEX (parent_city, parent_settlement, name),
111    INDEX (parent_settlement, name)
112 ) TYPE = innodb;
113 INSERT INTO streets(name, type, _index, code)
114     SELECT SQL_BIG_RESULT STREET.name, types.id, _index, LEFT(code,15)
115     FROM STREET
116         INNER JOIN types ON STREET.socr = types.short_name
117     WHERE RIGHT(code,2)="00" AND SUBSTRING(code, 12, 4)<>"0000";
118 UPDATE streets SET parent_region = (SELECT id FROM regions WHERE code = LEFT(streets.code,2));
119 UPDATE streets SET parent_city = (SELECT id FROM cities WHERE code = LEFT(streets.code,8));
120 UPDATE streets SET parent_settlement = (SELECT id FROM settlements WHERE code = LEFT(streets.code,11));
121
122 -- �����
123 CREATE TABLE buildings (
124    id INT(1) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
125    name VARCHAR(40) NOT NULL,
126    korp CHAR(1) NOT NULL,
127    type INT(1) UNSIGNED NOT NULL,
128    _index CHAR(6) NOT NULL,
129    parent_city INT(1) UNSIGNED NULL,
130    parent_settlement INT(1) UNSIGNED NULL,
131    parent_street INT(1) UNSIGNED NULL,
132    code CHAR(19) NOT NULL,
133    INDEX (name),
134    INDEX (type),
135    INDEX (parent_city, name),
136    INDEX (parent_settlement, name),
137    INDEX (parent_street, name),
138    UNIQUE INDEX (code)
139 ) TYPE = innodb;
140 INSERT INTO buildings(name, korp, type, _index, code)
141     SELECT SQL_BIG_RESULT DOMA.name, DOMA.korp, types.id, _index, code
142     FROM DOMA
143         INNER JOIN types ON DOMA.socr = types.short_name
144     WHERE RIGHT(code, 4)<>"0000";
145 UPDATE buildings SET parent_city = (SELECT id FROM cities WHERE code = LEFT(buildings.code,8));
146 UPDATE buildings SET parent_settlement = (SELECT id FROM settlements WHERE code = LEFT(buildings.code,11));
147 UPDATE buildings SET parent_street = (SELECT id FROM streets WHERE code = LEFT(buildings.code,15));
148
149 -- �������code'
150 ALTER TABLE regions DROP code;
151 ALTER TABLE zones DROP code;
152 ALTER TABLE cities DROP code;
153 ALTER TABLE settlements DROP code;
154 ALTER TABLE streets DROP code;
155 ALTER TABLE buildings DROP code;
156
157 -- ����������/*
158 SELECT name, id, type FROM streets FORCE INDEX(parent_settlement) WHERE parent_settlement = 12
159    AND name LIKE '�'
160    LIMIT 10;
161 SELECT name, id, type FROM streets FORCE INDEX(parent_city) WHERE parent_city = 85
162    AND parent_settlement IS NULL
163    AND name LIKE '�'
164    LIMIT 10;
165 SELECT name, id, type FROM streets FORCE INDEX(parent_region) WHERE parent_region = 85
166    AND name LIKE '�'
167    AND parent_city IS NULL
168    AND parent_settlement IS NULL
169    LIMIT 10;
170
171 SELECT name, id, type FROM settlements WHERE parent_city = 12
172    AND name LIKE '�' LIMIT 10;
173 SELECT name, id, type FROM settlements WHERE parent_zone = 12
174    AND name LIKE '�' LIMIT 10;
175 SELECT name, id, type FROM settlements WHERE parent_region = 12
176    AND name LIKE '�'
177    AND parent_zone IS NULL
178    AND parent_city IS NULL LIMIT 10;
179
180 SELECT name, id, type FROM cities WHERE parent_zone = 12
181    AND name LIKE '�' LIMIT 10;
182 SELECT name, id, type FROM cities WHERE parent_region = 12
183    AND name LIKE '�'
184    AND parent_zone IS NULL LIMIT 10;
185
186 SELECT name, id, type FROM zones WHERE parent_region = 12
187    AND name LIKE '�' LIMIT 10;
188 SELECT name, id, type FROM regions WHERE name LIKE '�' LIMIT 10;
189 */
Note: See TracBrowser for help on using the browser.