Массовая вставка полей геометрии в MySQL

У меня есть база данных mysql, которую я пытаюсь заполнить из текстового файла. Содержимое моего файла выглядит так (как несколько примеров. Там тысячи строк)

1:GeomFromText('Polygon(0 0, 1 1, 2 2, 0 0)')
2:GeomFromText('Polygon(0 0, 1 2, 2 2, 0 0)')

В моей схеме первое поле — целое число, а второе — ГЕОМЕТРИЯ.

пытаюсь загрузить данные

LOAD DATA LOCAL INFILE 'myfile.txt' INTO TABLE `testDb`.`testTable` FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'

И я получаю ошибку

Error Code 1416 Cannot get geometry object from data you send to the GEOMETRY field

Если я попытаюсь сделать отдельную вставку, например:

INSERT INTO TABLE testTable(id,region) VALUES (1,GeomFromText('Polygon(0 0, 1 1, 2 2, 0 0)'))

Работает без проблем. Однако это очень неэффективно для большого количества вставок. Кто-нибудь знает, почему массовая загрузка выдает эту ошибку?

спасибо, Джефф


person Jeff Storey    schedule 21.09.2010    source источник
comment
Почему бы вам не написать очень простой скрипт на bash или php или что-то еще, что будет выполнять все вставки при просмотре файла. Я думаю, что даже AWK может сделать это довольно хорошо.   -  person Scott    schedule 21.09.2010
comment
Это несколько сотен тысяч вставок, что очень медленно с точки зрения базы данных.   -  person Jeff Storey    schedule 21.09.2010
comment
@ Скотт. на самом деле были некоторые другие замедления. теперь вставка с зацикливанием занимает всего около 4 минут, так что это работает для нашего случая. благодаря.   -  person Jeff Storey    schedule 21.09.2010
comment
слишком локализовано -- вы пытаетесь оценить SQL/MM в нагрузке, а не WKT. Скорее всего, чтобы запутать поисковые системы и многих людей.   -  person Evan Carroll    schedule 19.04.2019


Ответы (1)


Массовая вставка не оценивает операторы sql, она просто помещает значения в базу данных. Это означает, что GeomFromText('Polygon(0 0, 1 1, 2 2, 0 0)') интерпретируется как просто строковое значение, которое не является объектом Geometry и, следовательно, не может быть вставлено в столбец геометрии.

Вам нужно установить функцию, которая будет вызываться при вставке каждой строки, как показано ниже, где выделенный текст obj_id и obj_geo — это имена столбцов:

LOAD DATA INFILE 'c:\myFile.txt'
INTO TABLE `tbl_myTable`
(@var1, @var2)
SET
obj_id = @var1,
obj_geo = GeomFromText(@var2);
person Joseph Lust    schedule 05.01.2011
comment
я пытаюсь создать csv из отдельной программы с MULTIPOLYGONS, и когда я его импортирую, он генерирует NULL. Можете ли вы привести пример простой строки csv? - person jimkont; 20.02.2011
comment
Вероятно, вам нужно использовать правильный конструктор для MySQL и MULTIPOLYGONS. Ознакомьтесь с MySQLdocs (ссылка) для этот объект. Вам нужно будет адаптировать приведенный выше пример к этому типу и убедиться, что он хранится в столбце Geometry. - person Joseph Lust; 31.03.2011