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

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

Полная БД выгружается налоговой в двух форматах - 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

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

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

Процессор Е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

Откуда:
Сообщений: 36389
Обновлю ссылку:
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

Откуда: Зеленоград, Москва, Россия
Сообщений: 16227
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

Откуда: Зеленоград, Москва, Россия
Сообщений: 16227
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

Откуда: Зеленоград, Москва, Россия
Сообщений: 16227
Добавление 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

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

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

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

Откуда: Зеленоград, Москва, Россия
Сообщений: 16227
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

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

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

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

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

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


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

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

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

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

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

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

Откуда: Питер
Сообщений: 33567
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / MySQL Ответить