2010-09-21 8 views
2

J'ai une base de données mysql que j'essaie de remplir à partir d'un fichier texte. Le contenu de mon dossier ressemblent (comme seulement quelques exemples. Il y a des milliers de lignes)MySQL Bulk Insérer des champs de géométrie

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

Dans mon schéma, le premier champ est un entier et le second est GEOMETRIE

J'essaie de charger le données

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

Et je reçois l'erreur

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

Si je tente de faire un insert individuel comme:

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

Cela fonctionne sans problème. Ceci est très inefficace pour un grand nombre d'inserts cependant. Est-ce que quelqu'un sait pourquoi la charge en vrac jette cette erreur?

, merci Jeff

+0

Pourquoi écrivez-vous pas un très script simple en bash ou php ou quelque chose qui va effectuer tous les inserts en passant par le fichier. Même AWK pourrait très bien le faire, je pense. – Scott

+0

Il s'agit de plusieurs centaines de milliers d'insertions, ce qui est très lent en termes de base de données. –

+0

@Scott. il y avait effectivement d'autres ralentissements. maintenant l'insertion avec bouclage ne prend que 4 minutes, ce qui fonctionne pour notre cas. Merci. –

Répondre

4

insertion en bloc n'évalue pas les instructions SQL, il place simplement les valeurs dans la db. Cela signifie que GeomFromText ('Polygon (0 0, 1 1, 2 2, 0 0)') est interprété comme une simple valeur de chaîne, qui n'est pas un objet Geometry et ne peut donc pas être inséré dans une colonne Geometry.

Vous devez définir une fonction à appeler à chaque insertion de ligne comme ci-dessous où souligné le texteobj_id et obj_geo sont les noms de colonnes:

LOAD DATA INFILE 'c:\myFile.txt' 
INTO TABLE `tbl_myTable` 
(@var1, @var2) 
SET 
obj_id = @var1, 
obj_geo = GeomFromText(@var2); 
+0

J'essaie de créer le csv à partir d'un programme séparé avec MULTIPOLYGONS et quand je l'importe, il génère des valeurs NULL. Pouvez-vous donner un exemple d'une simple ligne csv? – jimkont

+0

Vous avez probablement besoin d'utiliser le bon constructeur pour MySQL et MULTIPOLYGONS. Découvrez les MySQLdocs ([link] (http://dev.mysql.com/doc/refman/5.0/en/gis-class-multipolygon.html)) pour cet objet. Vous devrez adapter l'exemple ci-dessus à ce type et vous assurer qu'il est stocké dans une colonne Geometry. –