powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Импорт БД ФИАС в MySQL. Практический опыт.
25 сообщений из 48, страница 1 из 2
Импорт БД ФИАС в MySQL. Практический опыт.
    #39128929
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот потребовалось. Соответственно задача решена, поделюсь решением.

Полная БД выгружается налоговой в двух форматах - DBF и XML. Но с DBF работать неудобно, да и таблицы там нарублены на кучу частей. В общем, сразу решено было использовать исходные данные в XML, тем более что MySQL имеет средства загрузки из них напрямую.

Первым делом на основе XSD-схем данных были построены скрипты создания таблиц. Заодно выяснилось, что схемы даны не все, а их содержимое не всегда соответствует файлу с описанием формата выгрузки, размещённому на сайте ФИАС. Но задача несложная, работаем по факту.

скрипты создания таблиц
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
CREATE TABLE IF NOT EXISTS `ActualStatus` (
`ACTSTATID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор статуса (ключ)',
`NAME` VARCHAR(100) /* NOT NULL */ COMMENT 'Наименование'
) ENGINE=MyISAM COMMENT 'Статус актуальности ФИАС';

CREATE TABLE IF NOT EXISTS `AddressObject` (
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор адресного объекта ',
`FORMALNAME` VARCHAR(120) /* NOT NULL */ COMMENT 'Формализованное наименование',
`REGIONCODE` VARCHAR(2) /* NOT NULL */ COMMENT 'Код региона',
`AUTOCODE` VARCHAR(1) /* NOT NULL */ COMMENT 'Код автономии',
`AREACODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код района',
`CITYCODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код города',
`CTARCODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код внутригородского района',
`PLACECODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код населенного пункта',
`STREETCODE` VARCHAR(4) COMMENT 'Код улицы',
`EXTRCODE` VARCHAR(4) /* NOT NULL */ COMMENT 'Код дополнительного адресообразующего элемента',
`SEXTCODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код подчиненного дополнительного адресообразующего элемента',
`OFFNAME` VARCHAR(120) COMMENT 'Официальное наименование',
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`IFNSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКТМО',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата  внесения (обновления) записи',
`SHORTNAME` VARCHAR(10) /* NOT NULL */ COMMENT 'Краткое наименование типа объекта',
`AOLEVEL` INTEGER /* NOT NULL */ COMMENT 'Уровень адресного объекта ',
`PARENTGUID` VARCHAR(36) COMMENT 'Идентификатор объекта родительского объекта',
`AOID` VARCHAR(36) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Уникальный идентификатор записи. Ключевое поле',
`PREVID` VARCHAR(36) COMMENT 'Идентификатор записи связывания с предыдушей исторической записью',
`NEXTID` VARCHAR(36) COMMENT 'Идентификатор записи  связывания с последующей исторической записью',
`CODE` VARCHAR(17) COMMENT 'Код адресного объекта одной строкой с признаком актуальности из КЛАДР 4.0. ',
`PLAINCODE` VARCHAR(15) COMMENT 'Код адресного объекта из КЛАДР 4.0 одной строкой без признака актуальности (последних двух цифр)',
`ACTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус актуальности адресного объекта ФИАС. Актуальный адрес на текущую дату. Обычно последняя запись об адресном объекте.',
`CENTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус центра',
`OPERSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus)',
`CURRSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус актуальности КЛАДР 4 (последние две цифры в коде)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ',
`LIVESTATUS` ENUM('0','1') /* NOT NULL */ COMMENT 'Признак действующего адресного объекта'
) ENGINE=MyISAM COMMENT 'Классификатор адресообразующих элементов';

CREATE TABLE IF NOT EXISTS `CenterStatus` (
`CENTERSTID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор статуса (ключ)',
`NAME` VARCHAR(100) /* NOT NULL */ COMMENT 'Наименование'
) ENGINE=MyISAM COMMENT 'Статус центра';

CREATE TABLE IF NOT EXISTS `CurrentStatus` (
`CURENTSTID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор статуса (ключ)',
`NAME` VARCHAR(100) /* NOT NULL */ COMMENT 'Наименование'
) ENGINE=MyISAM COMMENT 'Статус актуальности КЛАДР 4.0';

CREATE TABLE IF NOT EXISTS `EstateStatus` (
`ESTSTATID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Признак владения (ключ)',
`NAME` VARCHAR(20) /* NOT NULL */ COMMENT 'Наименование',
`SHORTNAME` VARCHAR(20) COMMENT 'Краткое наименование'
) ENGINE=MyISAM COMMENT 'Признак владения';

CREATE TABLE IF NOT EXISTS `House` (
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`IFNSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКTMO',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата время внесения (обновления) записи',
`HOUSENUM` VARCHAR(20) COMMENT 'Номер дома',
`ESTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Признак владения',
`BUILDNUM` VARCHAR(10) COMMENT 'Номер корпуса',
`STRUCNUM` VARCHAR(10) COMMENT 'Номер строения',
`STRSTATUS` INTEGER COMMENT 'Признак строения',
`HOUSEID` VARCHAR(36) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Уникальный идентификатор записи дома',
`HOUSEGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор дома',
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Guid записи родительского объекта (улицы, города, населенного пункта и т.п.)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`STATSTATUS` INTEGER /* NOT NULL */ COMMENT 'Состояние дома',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ',
`COUNTER` INTEGER /* NOT NULL */ COMMENT 'Счетчик записей домов для КЛАДР 4'
) ENGINE=MyISAM COMMENT 'Сведения по номерам домов улиц городов и населенных пунктов, номера земельных участков и т.п.';

CREATE TABLE IF NOT EXISTS `HouseInterval` (
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`IFNSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКTMO',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата время внесения (обновления) записи',
`INTSTART` INTEGER /* NOT NULL */ COMMENT 'Значение начала интервала',
`INTEND` INTEGER /* NOT NULL */ COMMENT 'Значение окончания интервала',
`HOUSEINTID` VARCHAR(36) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор записи интервала домов',
`INTGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор интервала домов',
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Идентификатор объекта родительского объекта (улицы, города, населенного пункта и т.п.)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`INTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус интервала (обычный, четный, нечетный)',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ',
`COUNTER` INTEGER /* NOT NULL */ COMMENT 'Счетчик записей домов для КЛАДР 4'
) ENGINE=MyISAM COMMENT 'Интервалы домов';

CREATE TABLE IF NOT EXISTS `HouseStateStatus` (
`HOUSESTID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор статуса',
`NAME` VARCHAR(60) /* NOT NULL */ COMMENT 'Наименование'
) ENGINE=MyISAM COMMENT 'Статус состояния домов';

CREATE TABLE IF NOT EXISTS `IntervalStatus` (
`INTVSTATID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор статуса (обычный, четный, нечетный)',
`NAME` VARCHAR(60) /* NOT NULL */ COMMENT 'Наименование'
) ENGINE=MyISAM COMMENT 'Статус интервала домов';

CREATE TABLE IF NOT EXISTS `Landmark` (
`LOCATION` VARCHAR(500) /* NOT NULL */ COMMENT 'Месторасположение ориентира',
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`INFSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКТМО',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата внесения (обновления) записи',
`LANDID` VARCHAR(36) /* NOT NULL */ COMMENT 'Уникальный идентификатор записи ориентира',
`LANDGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор ориентира',
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Уникальный идентификатор родительского объекта (улицы, города, населенного пункта и т.п.)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ'
) ENGINE=MyISAM COMMENT 'Описание мест расположения  имущественных объектов';

CREATE TABLE IF NOT EXISTS `NormativeDocumentType` (
`NDTYPEID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор записи (ключ)',
`NAME` VARCHAR(250) /* NOT NULL */ COMMENT 'Наименование типа нормативного документа'
) ENGINE=MyISAM COMMENT 'Тип нормативного документа';

CREATE TABLE IF NOT EXISTS `NormativeDocument` (
`NORMDOCID` VARCHAR(36) /* NOT NULL */ COMMENT 'Идентификатор нормативного документа',
`DOCNAME` VARCHAR(21783) COMMENT 'Наименование документа',
`DOCDATE` DATE COMMENT 'Дата документа',
`DOCNUM` VARCHAR(20) COMMENT 'Номер документа',
`DOCTYPE` INTEGER /* NOT NULL */ COMMENT 'Тип документа',
`DOCIMGID` INTEGER COMMENT 'Идентификатор образа (внешний ключ)'
) ENGINE=MyISAM COMMENT 'Сведения по нормативному документу, являющемуся основанием присвоения адресному элементу наименования';

CREATE TABLE IF NOT EXISTS `OperationStatus` (
`OPERSTATID` INTEGER /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор статуса (ключ)',
`NAME` VARCHAR(100) /* NOT NULL */ COMMENT 'Наименование'
) ENGINE=MyISAM COMMENT 'Статус действия';

CREATE TABLE IF NOT EXISTS `AddressObjectType` (
`LEVEL` INTEGER /* NOT NULL */ COMMENT 'Тип адресного объекта',
`SCNAME` VARCHAR(10) COMMENT 'Краткое наименование типа объекта',
`SOCRNAME` VARCHAR(50) /* NOT NULL */ COMMENT 'Полное наименование типа объекта',
`KOD_T_ST` VARCHAR(4) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Ключевое поле'
) ENGINE=MyISAM COMMENT 'Тип адресного объекта';

CREATE TABLE IF NOT EXISTS `StructureStatus` (
`STRSTATID` INTEGER /* NOT NULL */ COMMENT 'Признак строения',
`NAME` VARCHAR(20) /* NOT NULL */ COMMENT 'Наименование',
`SHORTNAME` VARCHAR(20) COMMENT 'Краткое наименование'
) ENGINE=MyISAM COMMENT 'Признак строения';

CREATE TABLE IF NOT EXISTS `DeletedAddressObject` (
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор адресного объекта ',
`FORMALNAME` VARCHAR(120) /* NOT NULL */ COMMENT 'Формализованное наименование',
`REGIONCODE` VARCHAR(2) /* NOT NULL */ COMMENT 'Код региона',
`AUTOCODE` VARCHAR(1) /* NOT NULL */ COMMENT 'Код автономии',
`AREACODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код района',
`CITYCODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код города',
`CTARCODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код внутригородского района',
`PLACECODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код населенного пункта',
`STREETCODE` VARCHAR(4) COMMENT 'Код улицы',
`EXTRCODE` VARCHAR(4) /* NOT NULL */ COMMENT 'Код дополнительного адресообразующего элемента',
`SEXTCODE` VARCHAR(3) /* NOT NULL */ COMMENT 'Код подчиненного дополнительного адресообразующего элемента',
`OFFNAME` VARCHAR(120) COMMENT 'Официальное наименование',
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`IFNSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКТМО',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата  внесения (обновления) записи',
`SHORTNAME` VARCHAR(10) /* NOT NULL */ COMMENT 'Краткое наименование типа объекта',
`AOLEVEL` INTEGER /* NOT NULL */ COMMENT 'Уровень адресного объекта ',
`PARENTGUID` VARCHAR(36) COMMENT 'Идентификатор объекта родительского объекта',
`AOID` VARCHAR(36) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Уникальный идентификатор записи. Ключевое поле',
`PREVID` VARCHAR(36) COMMENT 'Идентификатор записи связывания с предыдушей исторической записью',
`NEXTID` VARCHAR(36) COMMENT 'Идентификатор записи  связывания с последующей исторической записью',
`CODE` VARCHAR(17) COMMENT 'Код адресного объекта одной строкой с признаком актуальности из КЛАДР 4.0. ',
`PLAINCODE` VARCHAR(15) COMMENT 'Код адресного объекта из КЛАДР 4.0 одной строкой без признака актуальности (последних двух цифр)',
`ACTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус актуальности адресного объекта ФИАС. Актуальный адрес на текущую дату. Обычно последняя запись об адресном объекте.',
`CENTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус центра',
`OPERSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus)',
`CURRSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус актуальности КЛАДР 4 (последние две цифры в коде)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ',
`LIVESTATUS` ENUM('0','1') /* NOT NULL */ COMMENT 'Признак действующего адресного объекта'
) ENGINE=MyISAM COMMENT 'Классификатор адресообразующих элементов';

CREATE TABLE IF NOT EXISTS `DeletedHouse` (
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`IFNSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКTMO',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата время внесения (обновления) записи',
`HOUSENUM` VARCHAR(20) COMMENT 'Номер дома',
`ESTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Признак владения',
`BUILDNUM` VARCHAR(10) COMMENT 'Номер корпуса',
`STRUCNUM` VARCHAR(10) COMMENT 'Номер строения',
`STRSTATUS` INTEGER COMMENT 'Признак строения',
`HOUSEID` VARCHAR(36) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Уникальный идентификатор записи дома',
`HOUSEGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор дома',
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Guid записи родительского объекта (улицы, города, населенного пункта и т.п.)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`STATSTATUS` INTEGER /* NOT NULL */ COMMENT 'Состояние дома',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ',
`COUNTER` INTEGER /* NOT NULL */ COMMENT 'Счетчик записей домов для КЛАДР 4'
) ENGINE=MyISAM COMMENT 'Сведения по номерам домов улиц городов и населенных пунктов, номера земельных участков и т.п.';

CREATE TABLE IF NOT EXISTS `DeletedHouseInterval` (
`POSTALCODE` VARCHAR(6) COMMENT 'Почтовый индекс',
`IFNSFL` VARCHAR(4) COMMENT 'Код ИФНС ФЛ',
`TERRIFNSFL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ФЛ',
`IFNSUL` VARCHAR(4) COMMENT 'Код ИФНС ЮЛ',
`TERRIFNSUL` VARCHAR(4) COMMENT 'Код территориального участка ИФНС ЮЛ',
`OKATO` VARCHAR(11) COMMENT 'ОКАТО',
`OKTMO` VARCHAR(11) COMMENT 'ОКTMO',
`UPDATEDATE` DATE /* NOT NULL */ COMMENT 'Дата время внесения (обновления) записи',
`INTSTART` INTEGER /* NOT NULL */ COMMENT 'Значение начала интервала',
`INTEND` INTEGER /* NOT NULL */ COMMENT 'Значение окончания интервала',
`HOUSEINTID` VARCHAR(36) /* NOT NULL */ /* PRIMARY KEY */ COMMENT 'Идентификатор записи интервала домов',
`INTGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Глобальный уникальный идентификатор интервала домов',
`AOGUID` VARCHAR(36) /* NOT NULL */ COMMENT 'Идентификатор объекта родительского объекта (улицы, города, населенного пункта и т.п.)',
`STARTDATE` DATE /* NOT NULL */ COMMENT 'Начало действия записи',
`ENDDATE` DATE /* NOT NULL */ COMMENT 'Окончание действия записи',
`INTSTATUS` INTEGER /* NOT NULL */ COMMENT 'Статус интервала (обычный, четный, нечетный)',
`NORMDOC` VARCHAR(36) COMMENT 'Внешний ключ на нормативный документ',
`COUNTER` INTEGER /* NOT NULL */ COMMENT 'Счетчик записей домов для КЛАДР 4'
) ENGINE=MyISAM COMMENT 'Интервалы домов';

CREATE TABLE IF NOT EXISTS `DeletedNormativeDocument` (
`NORMDOCID` VARCHAR(36) /* NOT NULL */ COMMENT 'Идентификатор нормативного документа',
`DOCNAME` VARCHAR(21783) COMMENT 'Наименование документа',
`DOCDATE` DATE COMMENT 'Дата документа',
`DOCNUM` VARCHAR(20) COMMENT 'Номер документа',
`DOCTYPE` INTEGER /* NOT NULL */ COMMENT 'Тип документа',
`DOCIMGID` INTEGER COMMENT 'Идентификатор образа (внешний ключ)'
) ENGINE=MyISAM COMMENT 'Сведения по нормативному документу, являющемуся основанием присвоения адресному элементу наименования';

вспомогательные скриптыМогут потребоваться при обновлении, в текущей работе не использовались
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
-- Пересоздание базы данных

DROP DATABASE IF EXISTS fias;
CREATE DATABASE IF NOT EXISTS fias;
USE fias;

-- Скрипты удаления таблиц

DROP TABLE IF EXISTS `ActualStatus`;
DROP TABLE IF EXISTS `AddressObject`;
DROP TABLE IF EXISTS `AddressObjectType`;
DROP TABLE IF EXISTS `CenterStatus`;
DROP TABLE IF EXISTS `CurrentStatus`;
DROP TABLE IF EXISTS `EstateStatus`;
DROP TABLE IF EXISTS `House`;
DROP TABLE IF EXISTS `HouseInterval`;
DROP TABLE IF EXISTS `HouseStateStatus`;
DROP TABLE IF EXISTS `IntervalStatus`;
DROP TABLE IF EXISTS `Landmark`;
DROP TABLE IF EXISTS `NormativeDocument`;
DROP TABLE IF EXISTS `NormativeDocumentType`;
DROP TABLE IF EXISTS `OperationStatus`;
DROP TABLE IF EXISTS `StructureStatus`;
DROP TABLE IF EXISTS `DeletedAddressObject`;
DROP TABLE IF EXISTS `DeletedHouse`;
DROP TABLE IF EXISTS `DeletedHouseInterval`;
DROP TABLE IF EXISTS `DeletedNormativeDocument`;

-- Скрипты очистки таблиц

TRUNCATE TABLE `ActualStatus`;
TRUNCATE TABLE `AddressObject`;
TRUNCATE TABLE `AddressObjectType`;
TRUNCATE TABLE `CenterStatus`;
TRUNCATE TABLE `CurrentStatus`;
TRUNCATE TABLE `EstateStatus`;
TRUNCATE TABLE `House`;
TRUNCATE TABLE `HouseInterval`;
TRUNCATE TABLE `HouseStateStatus`;
TRUNCATE TABLE `IntervalStatus`;
TRUNCATE TABLE `Landmark`;
TRUNCATE TABLE `NormativeDocument`;
TRUNCATE TABLE `NormativeDocumentType`;
TRUNCATE TABLE `OperationStatus`;
TRUNCATE TABLE `StructureStatus`;
TRUNCATE TABLE `DeletedAddressObject`;
TRUNCATE TABLE `DeletedHouse`;
TRUNCATE TABLE `DeletedHouseInterval`;
TRUNCATE TABLE `DeletedNormativeDocument`;



В качестве движка выбран MyISAM - это ускоряет импорт. Также были отключены (в скриптах - закомментированы) ограничения и первичные индексы - с той же целью.

Имея готовые структуры, несложно выполнить импорт данных. Первым делом имена XML-файлов для удобства работы были укорочены. Затем построены запросы импорта данных (исходные файлы были расположены по пути b:\fias).

запросы импорта данных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
LOAD XML LOCAL INFILE 'b:\\fias\\ACTSTAT.XML' INTO TABLE `ActualStatus` ROWS IDENTIFIED BY '<ActualStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\ESTSTAT.XML' INTO TABLE `EstateStatus` ROWS IDENTIFIED BY '<EstateStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\INTVSTAT.XML' INTO TABLE `IntervalStatus` ROWS IDENTIFIED BY '<IntervalStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\STRSTAT.XML' INTO TABLE `StructureStatus` ROWS IDENTIFIED BY '<StructureStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\CENTERST.XML' INTO TABLE `CenterStatus` ROWS IDENTIFIED BY '<CenterStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\DEL_HOUSEINT.XML' INTO TABLE `DeletedHouseInterval` ROWS IDENTIFIED BY '<HouseInterval>';
LOAD XML LOCAL INFILE 'b:\\fias\\OPERSTAT.XML' INTO TABLE `OperationStatus` ROWS IDENTIFIED BY '<OperationStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\NDOCTYPE.XML' INTO TABLE `NormativeDocumentType` ROWS IDENTIFIED BY '<NormativeDocumentType>';
LOAD XML LOCAL INFILE 'b:\\fias\\HSTSTAT.XML' INTO TABLE `HouseStateStatus` ROWS IDENTIFIED BY '<HouseStateStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\CURENTST.XML' INTO TABLE `CurrentStatus` ROWS IDENTIFIED BY '<CurrentStatus>';
LOAD XML LOCAL INFILE 'b:\\fias\\DEL_NORMDOC.XML' INTO TABLE `DeletedNormativeDocument` ROWS IDENTIFIED BY '<NormativeDocument>';
LOAD XML LOCAL INFILE 'b:\\fias\\SOCRBASE.XML' INTO TABLE `AddressObjectType` ROWS IDENTIFIED BY '<AddressObjectType>';
LOAD XML LOCAL INFILE 'b:\\fias\\DEL_HOUSE.XML' INTO TABLE `DeletedHouse` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\DEL_ADDROBJ.XML' INTO TABLE `DeletedAddressObject` ROWS IDENTIFIED BY '<Object>';
-- порядка 10к записей
LOAD XML LOCAL INFILE 'b:\\fias\\LANDMARK.XML' INTO TABLE `Landmark` ROWS IDENTIFIED BY '<Landmark>';
-- порядка 150к записей
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSEINT.XML' INTO TABLE `HouseInterval` ROWS IDENTIFIED BY '<HouseInterval>';
-- порядка 4кк записей
LOAD XML LOCAL INFILE 'b:\\fias\\NORMDOC.XML' INTO TABLE `NormativeDocument` ROWS IDENTIFIED BY '<NormativeDocument>';
LOAD XML LOCAL INFILE 'b:\\fias\\ADDROBJ.XML' INTO TABLE `AddressObject` ROWS IDENTIFIED BY '<Object>';



Импорт всех файлов, кроме самого большого, прошёл быстро и хорошо (большие файлы NORMDOC.XML и ADDROBJ.XML импортировались 2 и 4 минуты соответственно, все остальные практически мгновенно).

А вот с самым большим, 16-гигабайтным HOUSE.XML возникла проблема. Сервер импортировал порядка четверти файла, после чего потребление памяти возрастало с исходных 450 Мбайт до 2 Гбайт и процесс обрывался по ошибке недостатка памяти.

Было принято решение поделить файл на части и выполнить их импорт. Для нарезки было быстро накидано приложение на VB6, файл поделен на 9 частей по 1,8 Гбайт.

Программа нарезки XML-файла. На форме размещены 2 кнопки с именами Start и Exit, и надпись с именем Protocol. Код модуля:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Dim flag As Boolean

Private Sub Start_Click()
Dim fso As Scripting.FileSystemObject
Dim src As Scripting.TextStream
Dim dst As Scripting.TextStream
Dim buffer As String
Dim i As Long, j As Long, k As Long
Dim header As String
Const portion As Integer = 16384
Const rec_cnt As Long = 4567890
Const fname As String = "b:\fias\house"
Const fext As String = ".xml"

i = 1
j = 0
flag = False
Set fso = New Scripting.FileSystemObject
Set src = fso.OpenTextFile(fname & fext, ForReading)
Set dst = fso.CreateTextFile(fname & CStr(i) & fext)
Do Until src.AtEndOfStream
    buffer = buffer & src.Read(portion)
    Do Until InStr(buffer, ">") = 0
        If i = 1 And j < 2 Then
            header = header & Left(buffer, InStr(buffer, ">")) & vbNewLine
        End If
        dst.WriteLine Left(buffer, InStr(buffer, ">"))
        buffer = Mid(buffer, 1 + InStr(buffer, ">"))
        j = j + 1
        k = k + 1
    Loop
    Protocol.Caption = "Part: " & CStr(i) & vbNewLine & "Record: " & CStr(j) & vbNewLine & "Total: " & CStr(k)
    DoEvents
    If flag Then Exit Do
    If j > rec_cnt Then
        dst.WriteLine "</Houses>"
        dst.Close
        i = i + 1
        j = 0
        Set dst = fso.CreateTextFile(fname & CStr(i) & fext)
        dst.Write header
    End If
Loop
src.Close
dst.Close
Protocol.Caption = Protocol.Caption & vbNewLine & "Done!"
End Sub

Private Sub Exit_Click()
flag = True
Unload Me
End Sub


Процесс деления на часты выполнялся прямо из среды VB6Nano и продолжался порядка 20 минут.

Затем полученные части были импортированы в базу.
Скрипт импорта таблицы по частям
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- порядка 40кк записей
/* Отключено - процесс загрузки завершается ошибкой
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
*/
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE1.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE2.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE3.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE4.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE5.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE6.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE7.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE8.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';
LOAD XML LOCAL INFILE 'b:\\fias\\HOUSE9.XML' INTO TABLE `House` ROWS IDENTIFIED BY '<House>';


Импорт прошёл без проблем, каждая часть импортировалась чуть больше 3 минут.

Итоговый размер базы данных составил около 9 Гбайт.

PS. При импорте было выявлено, что 4 записи таблицы NORMDOC.XML содержат некорректные относительно схемы данные (размер данных превышает размер поля). Но это мелочи...
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39128971
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнительные сведения по среде выполнения.

Весь процесс выполнялся локально на рабочей станции.

Процессор Е2160 1,8 ГГц.
Физической памяти 2 Гбайт.
ОС Windows 7 Max SP1 Rus.
Server version: 5.6.14-log MySQL Community Server (GPL).
Все кодировки (сервера, БД и пр.) - UTF8.
Все операции выполнялись непосредственно из UTF-8 консоли.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39142930
Artemeey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полезно будет добавить следующее:

Актуальную базу ФИАС в XML можно скачать тут: http://fias.nalog.ru/Public/DownloadPage.aspx
Обновления, так же можно скачать там. Обновление нужно накладывать на готовую БД.
Обновления необходимо проверять раз в сутки, чтобы не потерять актуальность данных.

Дату последнго обновления можно получить так: http://fias.nalog.ru/Public/Downloads/Actual/VerDate.txt
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39157880
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновлю ссылку:
http://fias.nalog.ru/Updates.aspx
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39189138
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может программу для нарезки больших файлов сделать на DELPHI ?!
Мне не удалось скомпилировать на VB...
А я в свою очередь сделаю программу которая автоматом будет создавать/удалять структуру и заливать XML в базу!
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39189190
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminsamaraМожет программу для нарезки больших файлов сделать на DELPHI ?!
Сделай, если не лень...
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39189201
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Я не знаю как нарезать XML...
а остальное сделал
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39189592
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminsamaraЯ не знаю как нарезать XML...В стартпосте есть "Программа нарезки XML-файла" на барсике. Там нет абсолютно ничего сложного, перевести её на дельфи - дело нескольких минут.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39189759
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,
тогда попрошу вышей помощи перевести =) я в свою очередь выложу свой проект, вдруг кому-то понадобиться =)
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39189963
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminsamara, дельфи у меня под рукой нет, вот по памяти набросал, смотрите.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
var src: file;
var dst : textfile;
var buffer : String;
var i , j, k : int64;
var header : String;
Const rn:= #10#13;
Const portion:  = 128;
Const rec_cnt:  = 4567890;
Const fname:  = "b:\fias\house";
Const fext:  = ".xml";

i: = 1;
j: = 0;
assign(
assignfile(src,concat(fname,fext));
reset(src);
assignfile(dst,concat(fname, trim(inttostr(i)), fext);
rewrite(dst);
repeat 
    buffer: = concat(buffer , blockRead(src,portion));
    repeat 
        If i = 1 And j < 2 Then
            header: = concat(header. Left(buffer, pos(">", buffer)), rn);
        WriteLn(dst, Left(buffer, pos(">", buffer));
        buffer: = copy(buffer, 1 + pos(">", buffer));
        j = j + 1;
        k = k + 1;
    Until pos(">", buffer) = 0;
    /*обработка нажатия "отмены" - хоть убей не помню как это на дельфях рисуется*/
    If j > rec_cnt Then begin
        WriteLn(dst, "</Houses>");
        closefile(dst);
        i = i + 1;
        j = 0;
        assignfile(dst,concat(fname, trim(inttostr(i)), fext);
        rewrite(dst);
        WriteLn(dst, header);
    End;
Until eof(src);
Closefile(src);
Closefile(dst);

Только я что-то не пойму, откуда возьмётся открывающий тег <Houses> в следующих файлах-кусках. Акина, с исходным кодом всё в порядке?
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39190033
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirТолько я что-то не пойму, откуда возьмётся открывающий тег <Houses> в следующих файлах-кусках.
На первом "обороте" он сохраняется в переменной header, которая потом пишется во все куски.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39192278
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть убейте, не могу скомпилировать и понять код.... Помогите с рабочей процедурой... Для всех хочу сделать программу =)
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39192284
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не зря же тему прикрепили, хоть что-то полезное сделаю)
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195289
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавление 1.

Файлы в архиве выгрузки имеют длинные имена с GUID-идентификатором. Код же рассчитан на укороченные имена. Вот BAT-файл переименования:
rename.bat
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ren AS_ACTSTAT_*.XML ACTSTAT.XML
ren AS_ADDROBJ_*.XML ADDROBJ.XML
ren AS_CENTERST_*.XML CENTERST.XML
ren AS_CURENTST_*.XML CURENTST.XML
ren AS_DEL_ADDROBJ_*.XML DEL_ADDROBJ.XML
ren AS_DEL_HOUSEINT_*.XML DEL_HOUSEINT.XML
ren AS_DEL_HOUSE_*.XML DEL_HOUSE.XML
ren AS_DEL_NORMDOC_*.XML DEL_NORMDOC.XML
ren AS_ESTSTAT_*.XML ESTSTAT.XML
ren AS_HOUSEINT_*.XML HOUSEINT.XML
ren AS_HOUSE_*.XML HOUSE.XML
ren AS_HSTSTAT_*.XML HSTSTAT.XML
ren AS_INTVSTAT_*.XML INTVSTAT.XML
ren AS_LANDMARK_*.XML LANDMARK.XML
ren AS_NDOCTYPE_*.XML NDOCTYPE.XML
ren AS_NORMDOC_*.XML NORMDOC.XML
ren AS_OPERSTAT_*.XML OPERSTAT.XML
ren AS_SOCRBASE_*.XML SOCRBASE.XML
ren AS_STRSTAT_*.XML STRSTAT.XML




Добавление 2.

Программа проверена - работает корректно. Прикладываю архив с проектом и компилированным файлом.
В поле источника можно заносить файл как с расширением, так и без него.
Никаких проверок на предмет сбоев файловых операций (в т.ч. и на свободное место) не делал - лень.
Константы размера блока чтения и количества записей на одну часть взял практически с потолка, кому не влом - можно править, не вылетая за ограничения среды исполнения.

Добавление 3.

Со всем вышеприведённым кодом провёл только что импорт свежих данных - успешно.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195324
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавление 4.

Рукозады, которые выкладывают свежую БД, не следят за выгрузкой. В результате в некоторых записях выгружаемого XML кириллица заменяется энтитьками, и размер данных поля начинает превышать установленную их же собственной схемой данных длину. Соответственно возникают грабли при импорте - ведь LOAD XML не производит конвертацию энтитек в символы.

Рекомендую после загрузки данных из файла NORMDOC.XML вставить команду SHOW WARNINGS - это позволит увидеть, с чем именно возникла проблема. Хотя их общее количество (на текущий момент - 18 штук) видно и так...
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195525
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaих общее количество (на текущий момент - 18 штук) видно и так
Вот перечень (и значения) проблемных на текущий момент записей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
mysql> select NORMDOCID, length(DOCNUM) len, char_length(DOCNUM) clen, DOCNUM from NormativeDocument where char_length(DOCNUM)>20;
+--------------------------------------+------+------+---------------------------------+
| NORMDOCID                            | len  | clen | DOCNUM                          |
+--------------------------------------+------+------+---------------------------------+
| bacda4e3-d78d-4ce6-8ce2-194edf495c85 |   30 |   30 | 17/57-1066&#x9;&#x9;&#x9;&#x9;  |
| 99b29e6e-7144-4b2d-bfb3-cc7153119cc4 |   29 |   29 | 011-10/02&#x9;&#x9;&#x9;&#x9;   |
| bc868c9b-fbe9-4cfa-99e2-170454111774 |   29 |   29 | 379-10/02&#x9;&#x9;&#x9;&#x9;   |
| 1b418dac-6da3-4b3d-bfed-5304ce51c8f0 |   24 |   24 | 17/53-950&#x9;&#x9;&#x9;        |
| 9a0a357a-2ee7-4d5e-ac90-2e4a7f51603d |   26 |   23 | &#x9;&#x9;&#x9;0231/адр         |
| d66adb25-bcf3-4a58-aac0-c42665c00680 |   26 |   23 | &#x9;&#x9;&#x9;0231/адр         |
| f22523e0-6d58-4517-80e1-f1ddd2e20f02 |   31 |   28 | &#x9;&#x9;&#x9;0140/адр&#x9;    |
| 577e728a-de02-40dc-b79f-c10e1481b454 |   26 |   23 | &#x9;&#x9;&#x9;1505/адр         |
| af3fc532-32be-46d1-a7ea-99b5b23d3a4f |   26 |   23 | &#x9;&#x9;&#x9;0263/адр         |
| 70427238-3203-4d50-88f7-dd8d154b96e7 |   26 |   23 | &#x9;&#x9;&#x9;2470/адр         |
| 752311b6-9228-4dfb-90ad-e4efe2ccdc07 |   26 |   23 | &#x9;&#x9;&#x9;2470/адр         |
| 58348ce7-1fe7-4b4a-b636-2c300f1e4c73 |   26 |   23 | &#x9;&#x9;&#x9;2297/адр         |
| bc46f9a8-fb71-4a10-b082-47aa3e142d8b |   26 |   23 | &#x9;&#x9;&#x9;2297/адр         |
| b90fbc0a-fa35-4e53-bfc4-644a23e80e69 |   26 |   23 | &#x9;&#x9;&#x9;1774/адр         |
| 7497d687-ea18-42d6-a31f-4467a8bfcd6d |   31 |   28 | &#x9;&#x9;&#x9;0547/адр&#x9;    |
| 68fb8a68-f0e7-4e7d-bea2-5852745f524c |   31 |   28 | &#x9;&#x9;&#x9;0936/адр&#x9;    |
| 2477400f-32e9-4505-be94-071ac1bb4279 |   31 |   28 | 1657/адр&#x9;07.12.2011&#x9;    |
| c2ce9fb8-fd82-4606-aa9a-4544788e4875 |   31 |   28 | 1657/адр&#x9;07.12.2011&#x9;    |
+--------------------------------------+------+------+---------------------------------+
18 rows in set (13.06 sec)


В чём именно накосячено - видно. Видно также, как надо поправить скрипт, чтобы не было предупреждений:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IF NOT EXISTS `NormativeDocument` (
`NORMDOCID` VARCHAR(36) /* NOT NULL */ COMMENT 'Идентификатор нормативного документа',
`DOCNAME` VARCHAR(21773) COMMENT 'Наименование документа', -- было 21783
`DOCDATE` DATE COMMENT 'Дата документа',
`DOCNUM` VARCHAR(30) COMMENT 'Номер документа', -- было 20
`DOCTYPE` INTEGER /* NOT NULL */ COMMENT 'Тип документа',
`DOCIMGID` INTEGER COMMENT 'Идентификатор образа (внешний ключ)'
) ENGINE=MyISAM COMMENT 'Сведения по нормативному документу, являющемуся основанием присвоения адресному элементу наименования';
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195548
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и "выправление" таких записей - например, заменой табуляций на пробелы:
Код: sql
1.
2.
3.
UPDATE NormativeDocument 
SET DOCNUM = REPLACE(DOCNUM, '&#x9;', ' ')
WHERE LOCATE('&#x9;', DOCNUM);


На текущий момент таких "косых" записей 121 штука.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195620
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДобавление 4.

Рукозады, которые выкладывают свежую БД, не следят за выгрузкой. В результате в некоторых записях выгружаемого XML кириллица заменяется энтитьками, и размер данных поля начинает превышать установленную их же собственной схемой данных длину. Соответственно возникают грабли при импорте - ведь LOAD XML не производит конвертацию энтитек в символы.

Рекомендую после загрузки данных из файла NORMDOC.XML вставить команду SHOW WARNINGS - это позволит увидеть, с чем именно возникла проблема. Хотя их общее количество (на текущий момент - 18 штук) видно и так...

Это только в normdoc ?
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195655
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, что и в других таблицах (и даже в других полях этой) есть такого рода косяки - но я их не искал. Этот вылез исключительно потому, что длина данных была выше заявленной в схеме данных, и сервер ругнулся, что данные усечены.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39195777
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Просто я тоже загружал недавно, но НЕ загружал NORMDOC.

Пока ничего не нашлось плохого.
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39199970
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может есть у кого select такого типа:
Код: sql
1.
область-город-улица-дом
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39200063
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminsamaraМожет есть у кого select такого типа:
Код: sql
1.
область-город-улица-дом



а что на входе?

и какая СУБД? Если MySQL, то все сильно непросто...
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39200076
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
именно она, MYSQL...
А что можно сделать, как упростить?!
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39200077
Фотография adminsamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivadminsamaraМожет есть у кого select такого типа:
Код: sql
1.
область-город-улица-дом



а что на входе?

и какая СУБД? Если MySQL, то все сильно непросто...

делаю в дельфи в комбобоксе выбираю область-в следующем комбобоксе город и т д =)
...
Рейтинг: 0 / 0
Импорт БД ФИАС в MySQL. Практический опыт.
    #39231074
EmilSabitov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, ты выручил своим постом! Хочу поддержать тебя и задонатить) Говори куда деньги класть)
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Импорт БД ФИАС в MySQL. Практический опыт.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]