Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Ну вот потребовалось. Соответственно задача решена, поделюсь решением.

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

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

+ скрипты создания таблиц
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 'Сведения по нормативному документу, являющемуся основанием присвоения адресному элементу наименования';
+ вспомогательные скрипты
Могут потребоваться при обновлении, в текущей работе не использовались
-- Пересоздание базы данных

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).

+ запросы импорта данных
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. Код модуля:

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 минут.

Затем полученные части были импортированы в базу.
+ Скрипт импорта таблицы по частям
-- порядка 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 содержат некорректные относительно схемы данные (размер данных превышает размер поля). Но это мелочи...
15 дек 15, 17:57    [18564177]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Дополнительные сведения по среде выполнения.

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

Процессор Е2160 1,8 ГГц.
Физической памяти 2 Гбайт.
ОС Windows 7 Max SP1 Rus.
Server version: 5.6.14-log MySQL Community Server (GPL).
Все кодировки (сервера, БД и пр.) - UTF8.
Все операции выполнялись непосредственно из UTF-8 консоли.
15 дек 15, 18:19    [18564282]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Artemeey
Member

Откуда:
Сообщений: 59
Полезно будет добавить следующее:

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

Дату последнго обновления можно получить так: http://fias.nalog.ru/Public/Downloads/Actual/VerDate.txt
7 янв 16, 04:35    [18648977]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
miksoft
Member

Откуда:
Сообщений: 36315
Обновлю ссылку:
http://fias.nalog.ru/Updates.aspx
28 янв 16, 19:33    [18742279]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
Может программу для нарезки больших файлов сделать на DELPHI ?!
Мне не удалось скомпилировать на VB...
А я в свою очередь сделаю программу которая автоматом будет создавать/удалять структуру и заливать XML в базу!
10 мар 16, 14:49    [18915857]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
adminsamara
Может программу для нарезки больших файлов сделать на DELPHI ?!

Сделай, если не лень...
10 мар 16, 15:27    [18916064]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
Akina,

Я не знаю как нарезать XML...
а остальное сделал

К сообщению приложен файл. Размер - 20Kb
10 мар 16, 15:36    [18916114]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
tanglir
Member

Откуда:
Сообщений: 30154
adminsamara
Я не знаю как нарезать XML...
В стартпосте есть "Программа нарезки XML-файла" на барсике. Там нет абсолютно ничего сложного, перевести её на дельфи - дело нескольких минут.
11 мар 16, 08:22    [18918190]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
tanglir,
тогда попрошу вышей помощи перевести =) я в свою очередь выложу свой проект, вдруг кому-то понадобиться =)
11 мар 16, 11:12    [18918903]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
tanglir
Member

Откуда:
Сообщений: 30154
adminsamara, дельфи у меня под рукой нет, вот по памяти набросал, смотрите.
+
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> в следующих файлах-кусках. Акина, с исходным кодом всё в порядке?
11 мар 16, 13:19    [18919543]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
tanglir
Только я что-то не пойму, откуда возьмётся открывающий тег <Houses> в следующих файлах-кусках.

На первом "обороте" он сохраняется в переменной header, которая потом пишется во все куски.
11 мар 16, 14:08    [18919892]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
Хоть убейте, не могу скомпилировать и понять код.... Помогите с рабочей процедурой... Для всех хочу сделать программу =)
15 мар 16, 14:02    [18933393]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
Не зря же тему прикрепили, хоть что-то полезное сделаю)
15 мар 16, 14:04    [18933414]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Добавление 1.

Файлы в архиве выгрузки имеют длинные имена с GUID-идентификатором. Код же рассчитан на укороченные имена. Вот BAT-файл переименования:
+ rename.bat
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.

Со всем вышеприведённым кодом провёл только что импорт свежих данных - успешно.

К сообщению приложен файл (Divider.zip - 6Kb) cкачать
18 мар 16, 12:49    [18947685]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Добавление 4.

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

Рекомендую после загрузки данных из файла NORMDOC.XML вставить команду SHOW WARNINGS - это позволит увидеть, с чем именно возникла проблема. Хотя их общее количество (на текущий момент - 18 штук) видно и так...
18 мар 16, 13:20    [18947898]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Akina
их общее количество (на текущий момент - 18 штук) видно и так

Вот перечень (и значения) проблемных на текущий момент записей:
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)

В чём именно накосячено - видно. Видно также, как надо поправить скрипт, чтобы не было предупреждений:
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 'Сведения по нормативному документу, являющемуся основанием присвоения адресному элементу наименования';
18 мар 16, 15:45    [18948996]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Ну и "выправление" таких записей - например, заменой табуляций на пробелы:
UPDATE NormativeDocument 
SET DOCNUM = REPLACE(DOCNUM, '&#x9;', ' ')
WHERE LOCATE('&#x9;', DOCNUM);

На текущий момент таких "косых" записей 121 штука.
18 мар 16, 15:58    [18949135]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33424
Akina
Добавление 4.

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

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


Это только в normdoc ?
18 мар 16, 17:24    [18949776]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Возможно, что и в других таблицах (и даже в других полях этой) есть такого рода косяки - но я их не искал. Этот вылез исключительно потому, что длина данных была выше заявленной в схеме данных, и сервер ругнулся, что данные усечены.
18 мар 16, 18:02    [18950021]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33424
Akina,

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

Пока ничего не нашлось плохого.
18 мар 16, 19:57    [18950605]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
Может есть у кого select такого типа:
область-город-улица-дом
24 мар 16, 17:10    [18974488]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33424
adminsamara
Может есть у кого select такого типа:
область-город-улица-дом


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

и какая СУБД? Если MySQL, то все сильно непросто...
24 мар 16, 19:10    [18974993]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
MasterZiv,
именно она, MYSQL...
А что можно сделать, как упростить?!
24 мар 16, 19:34    [18975056]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 496
MasterZiv
adminsamara
Может есть у кого select такого типа:
область-город-улица-дом


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

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


делаю в дельфи в комбобоксе выбираю область-в следующем комбобоксе город и т д =)
24 мар 16, 19:36    [18975061]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
EmilSabitov
Member

Откуда:
Сообщений: 1
Akina, ты выручил своим постом! Хочу поддержать тебя и задонатить) Говори куда деньги класть)
6 май 16, 18:39    [19143962]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 19960
Загрузить сильно, дай код сравнения ваших домов, и домов в фиасе?
С учётом версий и домов в ленмарке.
17 июн 16, 20:34    [19307184]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 19960
И интервалов домов
17 июн 16, 20:35    [19307189]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
dikium
Member

Откуда:
Сообщений: 1
Akina, а не подскажете сколько записей содержится в таблице House? А то я тут на ночь оставил процесс импорта, а с утра обнаружил что комп завис. В итоге у меня в таблице 18 328 237 записей. Хочу, вот, понять, завершился ли процесс импорта...

Спасибо!
31 май 17, 12:35    [20526918]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Понятия не имею. В любом случае я бы пересоздал таблицу и перезалил данные. А в промежутке ещё бы и файловую систему проверил...
31 май 17, 19:19    [20528771]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 12596
Почему в этой базе г. Москва числится как регион? (AOLEVEL = 1)
Московская область тоже регион.
Хотел сделать выбор региона/города, но москву как город не найти (если AOLEVEL 4)
16 июл 17, 10:12    [20647801]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Akina, спасибо!
26 июл 17, 19:06    [20677720]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Исходник проги на делфи не выложите тут?
Прошу прощения за наглость
26 июл 17, 19:21    [20677740]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Статья по теме: Как перейти от КЛАДР к ФИАС и ничего себе не сломать
26 июл 17, 20:49    [20677889]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
miksoft
Member

Откуда:
Сообщений: 36315
Тогда уж вдогонку:
ФИАС умер, да здравствует… да здравствует… да не понятно что пока
Смысла мало, депрессии много.
26 июл 17, 21:07    [20677922]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
Ну "хоть что-то" всяко лучше, чем ничего, через какую бы задницу оно ни было.
27 июл 17, 21:44    [20681026]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
FLYERok
Member

Откуда:
Сообщений: 3
Здравствуйте!

Подскажите, пожалуйста, в чем может быть проблема:

Пытаюсь импортировать данные из файла AS_ADDROBJ.XML в таблицу addrobj. Всё пишется в таблицу, однако, вместо значений в яцейках пустота.

Использую команду

mysql> LOAD XML LOCAL INFILE '/Users/pavel/Desktop/testfias/AS_ADDROBJ.XML' INTO TABLE `addrobj` ROWS IDENTIFIED BY '<Object>';
Query OK, 3235532 rows affected, 65535 warnings (2 min 35,85 sec)
Records: 3235532  Deleted: 0  Skipped: 0  Warnings: 122950216


Использую последнюю на данный момент базу ФИАС с действующими с 2016 года схемой:
+ AS_ADDROBJ.xsd

<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2009 sp1 (http://www.altova.com) by Буравцев_А (EMBRACE) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns:usch="http://www.unisoftware.ru/schematron-extensions" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="AddressObjects">
<xs:annotation>
<xs:documentation>Состав и структура файла с информацией классификатора адресообразующих элементов БД ФИАС</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Object" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Классификатор адресообразующих элементов</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="AOGUID" use="required">
<xs:annotation>
<xs:documentation>Глобальный уникальный идентификатор адресного объекта </xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="36"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="FORMALNAME" use="required">
<xs:annotation>
<xs:documentation>Формализованное наименование</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="REGIONCODE" use="required">
<xs:annotation>
<xs:documentation>Код региона</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="AUTOCODE" use="required">
<xs:annotation>
<xs:documentation>Код автономии</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="AREACODE" use="required">
<xs:annotation>
<xs:documentation>Код района</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="CITYCODE" use="required">
<xs:annotation>
<xs:documentation>Код города</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="CTARCODE" use="required">
<xs:annotation>
<xs:documentation>Код внутригородского района</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="PLACECODE" use="required">
<xs:annotation>
<xs:documentation>Код населенного пункта</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="STREETCODE" use="optional">
<xs:annotation>
<xs:documentation>Код улицы</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="EXTRCODE" use="required">
<xs:annotation>
<xs:documentation>Код дополнительного адресообразующего элемента</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="SEXTCODE" use="required">
<xs:annotation>
<xs:documentation>Код подчиненного дополнительного адресообразующего элемента</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="OFFNAME" use="optional">
<xs:annotation>
<xs:documentation>Официальное наименование</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="POSTALCODE" use="optional">
<xs:annotation>
<xs:documentation>Почтовый индекс</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="6"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="IFNSFL" use="optional">
<xs:annotation>
<xs:documentation>Код ИФНС ФЛ</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="TERRIFNSFL" use="optional">
<xs:annotation>
<xs:documentation>Код территориального участка ИФНС ФЛ</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="IFNSUL" use="optional">
<xs:annotation>
<xs:documentation>Код ИФНС ЮЛ</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="TERRIFNSUL" use="optional">
<xs:annotation>
<xs:documentation>Код территориального участка ИФНС ЮЛ</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="OKATO" use="optional">
<xs:annotation>
<xs:documentation>OKATO</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="11"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="OKTMO" use="optional">
<xs:annotation>
<xs:documentation>OKTMO</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="8"/>
<xs:maxLength value="11"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="UPDATEDATE" type="xs:date" use="required">
<xs:annotation>
<xs:documentation>Дата внесения записи</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="SHORTNAME" use="required">
<xs:annotation>
<xs:documentation>Краткое наименование типа объекта</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="AOLEVEL" use="required">
<xs:annotation>
<xs:documentation>Уровень адресного объекта </xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="PARENTGUID" use="optional">
<xs:annotation>
<xs:documentation>Идентификатор объекта родительского объекта</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="36"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="AOID" use="required">
<xs:annotation>
<xs:documentation>Уникальный идентификатор записи. Ключевое поле.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="36"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="PREVID" use="optional">
<xs:annotation>
<xs:documentation>Идентификатор записи связывания с предыдушей исторической записью</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="36"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="NEXTID" use="optional">
<xs:annotation>
<xs:documentation>Идентификатор записи связывания с последующей исторической записью</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="36"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="CODE" use="optional">
<xs:annotation>
<xs:documentation>Код адресного объекта одной строкой с признаком актуальности из КЛАДР 4.0. </xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="17"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="PLAINCODE" use="optional">
<xs:annotation>
<xs:documentation>Код адресного объекта из КЛАДР 4.0 одной строкой без признака актуальности (последних двух цифр)</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="15"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="ACTSTATUS" use="required">
<xs:annotation>
<xs:documentation>Статус исторической записи в жизненном цикле адресного объекта:
0 – не последняя
1 - последняя</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="CENTSTATUS" use="required">
<xs:annotation>
<xs:documentation>Статус центра</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="OPERSTATUS" use="required">
<xs:annotation>
<xs:documentation>Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus):
01 – Инициация;
10 – Добавление;
20 – Изменение;
21 – Групповое изменение;
30 – Удаление;
31 - Удаление вследствие удаления вышестоящего объекта;
40 – Присоединение адресного объекта (слияние);
41 – Переподчинение вследствие слияния вышестоящего объекта;
42 - Прекращение существования вследствие присоединения к другому адресному объекту;
43 - Создание нового адресного объекта в результате слияния адресных объектов;
50 – Переподчинение;
51 – Переподчинение вследствие переподчинения вышестоящего объекта;
60 – Прекращение существования вследствие дробления;
61 – Создание нового адресного объекта в результате дробления
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="CURRSTATUS" use="required">
<xs:annotation>
<xs:documentation>Статус актуальности КЛАДР 4 (последние две цифры в коде)</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="STARTDATE" type="xs:date" use="required">
<xs:annotation>
<xs:documentation>Начало действия записи</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ENDDATE" type="xs:date" use="required">
<xs:annotation>
<xs:documentation>Окончание действия записи</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="NORMDOC" use="optional">
<xs:annotation>
<xs:documentation>Внешний ключ на нормативный документ</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="36"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="LIVESTATUS" use="required">
<xs:annotation>
<xs:documentation>Признак действующего адресного объекта</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:byte">
<xs:enumeration value="0"/>
<xs:enumeration value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="CADNUM" use="optional">
<xs:annotation>
<xs:documentation>Кадастровый номер</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="DIVTYPE" use="required">
<xs:annotation>
<xs:documentation>Тип адресации:
0 - не определено
1 - муниципальный;
2 - административно-территориальный</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:enumeration value="0"/>
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>



Сама таблица выглядит так.
+ addrobj.sql

CREATE TABLE `addrobj` (
`aoguid` varchar(36) NOT NULL,
`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) NOT NULL COMMENT 'Код улицы',
`extrcode` varchar(4) NOT NULL COMMENT 'Код дополнительного адресообразующего элемента',
`sextcode` varchar(3) NOT NULL COMMENT 'Код подчиненного дополнительного адресообразующего элемента',
`offname` varchar(120) NOT NULL COMMENT 'Официальное наименование',
`postalcode` char(6) NOT NULL COMMENT 'Почтовый индекс',
`ifnsfl` varchar(4) NOT NULL COMMENT 'Код ИФНС ФЛ',
`terrifnsfl` varchar(4) NOT NULL COMMENT 'Код территориального участка ИФНС ФЛ',
`ifnsul` varchar(4) NOT NULL COMMENT 'Код ИФНС ЮЛ',
`terrifnsul` varchar(4) NOT NULL COMMENT 'Код территориального участка ИФНС ЮЛ',
`okato` varchar(11) NOT NULL COMMENT 'ОКАТО',
`oktmo` varchar(11) NOT NULL COMMENT 'ОКТМО',
`updatedate` date NOT NULL COMMENT 'Дата внесения записи',
`shortname` varchar(10) NOT NULL COMMENT 'Краткое наименование типа объекта',
`aolevel` int(10) UNSIGNED NOT NULL COMMENT 'Уровень адресного объекта ',
`parentguid` char(36) NOT NULL COMMENT 'Идентификатор объекта родительского объекта',
`aoid` varchar(36) NOT NULL,
`previd` varchar(36) NOT NULL COMMENT 'Идентификатор записи связывания с предыдушей исторической записью',
`nextid` varchar(36) NOT NULL COMMENT 'Идентификатор записи связывания с последующей исторической записью',
`code` varchar(17) NOT NULL COMMENT 'Код адресного объекта одной строкой с признаком актуальности из КЛАДР 4.0',
`plaincode` varchar(15) NOT NULL COMMENT 'Код адресного объекта из КЛАДР 4.0 одной строкой без признака актуальности (последних двух цифр)',
`actstatus` tinyint(10) UNSIGNED NOT NULL COMMENT 'Статус актуальности адресного объекта ФИАС. Актуальный адрес на текущую дату. Обычно последняя запись об адресном объекте.',
`centstatus` int(10) UNSIGNED NOT NULL COMMENT 'Статус центра',
`operstatus` int(10) UNSIGNED NOT NULL COMMENT 'Статус действия над записью – причина появления записи',
`currstatus` int(10) UNSIGNED NOT NULL COMMENT 'Статус актуальности КЛАДР 4 (последние две цифры в коде)',
`startdate` date NOT NULL COMMENT 'Начало действия записи',
`enddate` date NOT NULL COMMENT 'Окончание действия записи',
`normdoc` varchar(36) NOT NULL COMMENT 'Внешний ключ на нормативный документ',
`livestatus` int(1) NOT NULL,
`cadnum` varchar(100) NOT NULL,
`divtype` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Классификатор адресообразующих элементов';


Пробовал на разных машинах с разной конфигурацией MySQL, результат один и тот же.

Хотя, с другим XML файлом StructureStatus.XML для более простой таблицы всё проходит на УРА:
LOAD XML LOCAL INFILE '/Users/pavel/Desktop/testfias/AS_STRSTAT.XML' INTO TABLE `StructureStatus` ROWS IDENTIFIED BY '<StructureStatus>';


+ AS_STRSTAT.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns:usch="http://www.unisoftware.ru/schematron-extensions" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="StructureStatuses">
<xs:annotation>
<xs:documentation>Состав и структура файла с информацией по признакам строения в БД ФИАС</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="StructureStatus" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Признак строения</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="STRSTATID" use="required">
<xs:annotation>
<xs:documentation>Признак строения</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="NAME" use="required">
<xs:annotation>
<xs:documentation>Наименование</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="SHORTNAME" use="optional">
<xs:annotation>
<xs:documentation>Краткое наименование</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>



Видимо MySQL при парсинге XML файла просто не находит нужные значения.

Подскажите, пожалуйста, как решить эту проблему.

Спасибо!
31 июл 17, 12:58    [20687622]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 12596
автор
Records: 3235532 Deleted: 0 Skipped: 0 Warnings: 122950216


SHOW WARNINGS;
31 июл 17, 13:07    [20687658]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
FLYERok
Member

Откуда:
Сообщений: 3
Hett, SHOW WARNINGS выдает для всех столбцов:
Column set to default value; NULL supplied to NOT NULL column


+ SHOW WARNINGS;
.
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------------+
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'aoguid' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'formalname' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'regioncode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'autocode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'areacode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'citycode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'ctarcode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'placecode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'streetcode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'extrcode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'sextcode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'offname' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'postalcode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'ifnsfl' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'terrifnsfl' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'ifnsul' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'terrifnsul' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'okato' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'oktmo' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'updatedate' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'shortname' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'aolevel' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'parentguid' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'aoid' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'previd' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'nextid' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'code' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'plaincode' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'actstatus' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'centstatus' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'operstatus' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'currstatus' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'startdate' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'enddate' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'normdoc' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'livestatus' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'cadnum' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'divtype' at row 1 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'aoguid' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'formalname' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'regioncode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'autocode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'areacode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'citycode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'ctarcode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'placecode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'streetcode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'extrcode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'sextcode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'offname' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'postalcode' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'ifnsfl' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'terrifnsfl' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'ifnsul' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'terrifnsul' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'okato' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'oktmo' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'updatedate' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'shortname' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'aolevel' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'parentguid' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'aoid' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'previd' at row 2 |
| Warning | 1263 | Column set to default value; NULL supplied to NOT NULL column 'nextid' at row 2 |
+---------+------+-------------------------------------------------------------------------------------+
64 rows in set (0,00 sec)
31 июл 17, 13:36    [20687797]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
FLYERok
Member

Откуда:
Сообщений: 3
Hett, Проблема оказалась в том, что имя XML-тега должно полностью соответствовать названию в таблице с учетом регистра. В моем случае в значения полей в таблице оказались в нижнем регистре.
31 июл 17, 14:40    [20688245]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 12596
У меня была такая мысль, но подумалось, что MySQL не регистрозависим в названиях таблиц, полей, операторов....
31 июл 17, 14:41    [20688262]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15935
FLYERok
Проблема оказалась в том, что имя XML-тега должно полностью соответствовать названию в таблице с учетом регистра.
Ну вообще-то это установлено стандартом. Это чтобы получить регистронезависимость - надо поизвращаться (ассертом там в схеме или ещё как).
31 июл 17, 15:33    [20688643]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Бакеев Дамир
Member

Откуда:
Сообщений: 11
Всем привет. встала задача загрузки FIAS в локальную базу Oracle и MySQL, т.к. в XML формате очень много грузить а нужно только один сфой регион было принято решение грузить из DBF т.к. на просторах интернета готового не нашел написал свой класс для загрузки DBF в MySQL, в дальнейшем буду дорабатывать для загрузки в Oracle.

опубликовал всё GitHab


<?php
	header('Content-type: text/html; charset=utf-8');
	class DBFLoader {
		
		private $Files;
		private $HeaderArray;
		private $FileCSV;
		
		public function __construct($DBF){
			if (!extension_loaded('dbase')) throw new Exception('Не найдено расширение dbase. подключите библиотеку');
			if(!$this -> FindDBF($DBF)) throw new Exception('Не найдено DBF файлов для обработки');
			$this ->TMPFolter = str_replace('\\', '/', sys_get_temp_dir().'/DBFLoader/');
			if (!is_dir($this ->TMPFolter)) mkdir($this ->TMPFolter);
		}
		
		public function __destruct() {
			foreach ($this -> files as $file) {
				$fileParts = explode( '/', $file);
				@unlink($this ->TMPFolter.preg_replace( '~\.[a-z]+$~i', '.csv', $fileParts[key( array_slice( $fileParts, -1, 1, true ) )] ));
			}
		}
		
		private Function FindDBF($Paths){
			if (!is_array($Paths)) 
				$Paths = explode (';', str_replace('\\', '/', $Paths));
			$this -> files =array();
			foreach($Paths as $Path_K => $Path_V){
				if (is_dir($Path_V))
					$this -> files = array_merge($this -> files, glob( $Path_V.'/*.DBF'));
				elseif (!empty($Path_V))
						$this -> files [] = $Path_V;
			}
			return ((count($this -> files)!=0)?True:false);
		}
		
		public Function Convert($ToBase){
			ini_set( 'memory_limit', '-1' );
			set_time_limit(0);
			foreach ($this -> files as $file) {
echo '<pre>'.var_export($file, true).'<pre>';
				if ($this ->ConvertDBF2CSV($file))
					if (!Empty($ToBase['MYSQL'])) $this ->Load_CSV4MySQL($ToBase['MYSQL']);
			}
		}
		
		private Function ConvertDBF2CSV($FileDBF, $FileCSV=''){
			if ($dbf = dbase_open($FileDBF, 0)) {
				if (Empty($FileCSV)) {
					$fileParts = explode( '/', $FileDBF );
					$endPart = $fileParts[key( array_slice( $fileParts, -1, 1, true ) )];
					$this ->FileCSV = $this ->TMPFolter.preg_replace( '~\.[a-z]+$~i', '.csv', $endPart );
				}
				else $this ->FileCSV = FileCSV;
				$num_rec = dbase_numrecords( $dbf );
				$NewCSV = '';
				for( $i = 1; $i <= $num_rec; $i++ ){
					$row = @dbase_get_record_with_names( $dbf, $i );
					$firstKey = key( array_slice( $row, 0, 1, true ) );
					foreach( $row as $key => $val ){
						if( $key == 'deleted' ) continue;
						if( $firstKey != $key ) $NewCSV .= '|';
						$NewCSV .= iconv("CP866", "UTF-8", trim( $val ));
					};
					$NewCSV .= "\n";
				};
				file_put_contents($this ->FileCSV, $NewCSV);
				$this -> HeaderArray = dbase_get_header_info($dbf);
				dbase_close($dbf);
				return true;
			} else {
				return False;
			}
		}
		
		private Function Load_CSV4MySQL($param){
// ------------------------------------			echo '<pre>'.var_export($param, true).'<pre>';
			$TypeBase = array (
				'number' => array('INTEGER'),
				'character' => array('VARCHAR', true),
				'date' => array('DATE'),
				'memo' => array('TEXT'),
			);
			$fileParts = explode( '/', $this ->FileCSV );
			
			$TableName=preg_replace( '~\.[a-z]+$~i', '', $fileParts[key( array_slice( $fileParts, -1, 1, true ) )] );
			if ($wpdb = new mysqli($param['host'], $param['user'], $param['pass'], $param['base'])) {
				
				$SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS '.$TableName.' ( ';
				foreach( $this -> HeaderArray as $key => $val ){
					$SQL_CREATE_TABLE .=	' `'.$val['name'].'` '.
								$TypeBase[$val['type']][0].
								(!empty($TypeBase[$val['type']][1]) ? '('.$val['length'].')' :'').
								((Count($this -> HeaderArray)-1!=$key)?',':'');
				};
				$SQL_CREATE_TABLE .= ') ENGINE=MyISAM';
				
				if ( !$wpdb->query($SQL_CREATE_TABLE) )
					exit('error:'. $wpdb->error);
				
				$sql = "LOAD DATA LOCAL INFILE '".$this ->FileCSV."'"; 
				$sql .= " INTO TABLE ".$TableName." ";
				$sql .= " CHARACTER SET utf8"; 
				$sql .= " FIELDS TERMINATED BY '|'"; 
				
				if ( !$wpdb->query($sql) )
					exit('error:'. $wpdb->error);
			}
		}
	}
25 авг 17, 12:05    [20748921]     Ответить | Цитировать Сообщить модератору
 Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
Бакеев Дамир
Member

Откуда:
Сообщений: 11
кстати забыл
  • файл запуска положить
  • написать что почему-то не открывается файлы типа "NORDOC02.DBF"
  • для работы необходимо в системе скачать и подключить библиотеку php_dbase.dll в файле "php.ini" строку "extension=php_dbase.dll"

    + Файл запуска
    	include 'DBFLoader.class.php';
    	$qweqwe = new DBFLoader('D:\WWW\fgbu02\fias_dbf');
    	$qweqwe -> Convert(array('MYSQL'=>array('host'=>"localhost",'user'=>"root", 'pass'=>"root", 'base'=>"fias")));
    
  • 25 авг 17, 12:46    [20749049]     Ответить | Цитировать Сообщить модератору
     Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
    Андрей15
    Member

    Откуда:
    Сообщений: 2
    Доброго всем дня,

    появилась необходимость импорта ФИАС. перечитал кучу инфы и вариантов импорта, но .... ничего не получается :(
    1. примеры из первого поста - увы уже не актуальны, найти нормальной инфы по импорту XSD схем - наверно плохо искал :( но не нашел.
    2. при импорте происходит оооооооочень долгая загрузка. так напаример ADDROBJ.XML у меня так и не грузится, примерно через час в консоли выдает ошибку "ERROR 2013 (HY000): Lost connection to MySQL server during query" - я так понимаю это ограничение на выполнение скрипта, при неоднократных попытках, я увеличивал время выполнения, но даже этот файл у меня грузился больше 20 часов после чего либо приходилось останавливать, либо банально свет выключали :(
    программкой что в этой ветке - ADDROBJ.XML не делится на части - на выходе получается один файл.
    памяти на серваке мало :( 1 гиг стоит убунта 16.04 и mysql 5.7 до эксперементов стоял 5.6 с базой фиас от 2014 года сейчас стоит задача поставить актуальную базу.
    подскажите гуру как при текущих условиях это сделать в разумные сроки - и вообще какие при моей конфигурации "сервака" можно считать разумными?
    6 сен 17, 04:26    [20774237]     Ответить | Цитировать Сообщить модератору
     Re: Импорт БД ФИАС в MySQL. Практический опыт.  [new]
    Андрей15
    Member

    Откуда:
    Сообщений: 2
    ps
    пробовал импортировать dbf по своему региону из последних постов, но и он в базу пишет абракадабру - насколько я понял в базу почему-то попадают записи в кодировке cp1251 - но почему это происходит - мне так и не понятно
    6 сен 17, 04:28    [20774238]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2      [все]
    Все форумы / MySQL Ответить