Für PostGIS 2.x können Sie die DDL ALTER TABLE mithilfe eines Ausdrucks verwenden .
Verwenden Sie ST_Multi, um von einer einteiligen in eine mehrteilige Geometrie zu konvertieren :
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
Das Konvertieren von einer mehrteiligen in eine einteilige Geometrie ist etwas komplizierter, da Sie nur ein Teil verwenden und alle anderen Teile (sofern vorhanden) ignorieren können. Überprüfen Sie zuerst Ihre Daten, um festzustellen, ob Sie Geometrien mit mehr als einem Teil haben:
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
COUNT(geom) AS total_geom
FROM my_table;
Wenn Sie multi_geom
mehr als 0 sehen, besteht die Gefahr, dass Sie Daten verlieren. Sie sollten diese wahrscheinlich als mehrteilige Geometrie beibehalten. Wenn Sie 0 sehen, ist es sicher, eine einteilige Geometrie zu erstellen mit:
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);
Für PostGIS 1.x ist es etwas unordentlicher, da es mehrere Schritte gibt (danke @ rec.thegeom!).
Angenommen, eine Tabelle my_table
und eine Geometriespalte geom
sind die folgenden Schritte zum Konvertieren in ein mehrteiliges Element:
-- 1. Remove the geom_type constraint (if existing)
ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_geom;
-- 2. Update the geometry data to multi-part -- skip if it is an empty table
UPDATE my_table SET geom = ST_Multi(geom);
-- 3. Re-add a different geometry constraint for the new type
ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_geom
CHECK (geometrytype(geom) = 'MULTIPOINT'::text OR geom IS NULL);
-- 4. Update the geometry_columns metadata table
UPDATE geometry_columns SET type = 'MULTIPOINT'
WHERE f_table_schema = 'public' AND f_table_name = 'my_table' AND f_geometry_column = 'geom';