Per PostGIS 2.x , è possibile utilizzare ALTER TABLE DDL usando un'espressione .
Per convertire da una geometria singola a multiparte, utilizzare ST_Multi :
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
Per convertire da una geometria multiparte a una geometria a parte singola, è un po 'più complicato poiché è possibile utilizzare solo una parte e ignorare tutte le altre parti (se presenti). Controlla prima i tuoi dati per vedere se hai delle geometrie con più di una parte:
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
COUNT(geom) AS total_geom
FROM my_table;
Se vedi multi_geom
maggiore di 0, rischierai di perdere dati e probabilmente dovresti tenerli come geometria multiparte. Se vedi 0, è sicuro trasformarlo in una geometria a parte singola con:
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);
Per PostGIS 1.x , è un po 'più disordinato, poiché ci sono diversi passaggi (grazie a @ rec.thegeom!).
Supponendo una tabella my_table
e una colonna geometrica geom
, ecco i passaggi per la conversione in più parti:
-- 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';