Để thêm một cột vào bảng hiện có, hãy sử dụng ALTER TABLE DDL , ví dụ:
ALTER TABLE my_table
ADD COLUMN the_geom_mercator
geometry(Geometry,3857);
có thể được điền từ một cột khác (the_geom) bằng cách sử dụng:
UPDATE my_table SET
the_geom_mercator = ST_Transform(the_geom, 3857)
FROM spatial_ref_sys
WHERE ST_SRID(the_geom) = srid;
(dòng thứ ba FROM spatial_ref_sys ...
không cần thiết, nhưng nó bảo vệ chuyển đổi các nỗ lực với các phép chiếu không xác định hoặc không hợp lệ, gây ra lỗi).
Và nếu bảng này được duy trì (thêm / cập nhật), bạn có thể sử dụng chức năng kích hoạt để cập nhật_geom_mercator, ví dụ:
CREATE OR REPLACE FUNCTION my_table_tg_fn() RETURNS trigger AS
$BODY$BEGIN
IF TG_OP = 'INSERT' AND NEW.the_geom ISNULL THEN
RETURN NEW; -- no new geometry
ELSIF TG_OP = 'UPDATE' THEN
IF NEW.the_geom IS NOT DISTINCT FROM OLD.the_geom THEN
RETURN NEW; -- same old geometry
END IF;
END IF;
-- Attempt to transform a geometry
BEGIN
NEW.the_geom_mercator := ST_Transform(NEW.the_geom, 3857);
EXCEPTION WHEN SQLSTATE 'XX000' THEN
RAISE WARNING 'the_geom_mercator not updated: %', SQLERRM;
END;
RETURN NEW;
END;$BODY$ LANGUAGE plpgsql;
CREATE TRIGGER my_table_tg BEFORE INSERT OR UPDATE
ON my_table FOR EACH ROW
EXECUTE PROCEDURE my_table_tg_fn();
Lưu ý rằng ST_Transform nên bẫy lỗi và hiển thị cảnh báo, ví dụ:
postgis=# INSERT INTO my_table(the_geom)
postgis-# VALUES (ST_SetSRID(ST_MakePoint(0,1), 123))
postgis-# RETURNING the_geom, the_geom_mercator;
WARNING: the_geom_mercator not updated: GetProj4StringSPI: Cannot find SRID (123) in spatial_ref_sys
-[ RECORD 1 ]-----+---------------------------------------------------
the_geom | 01010000207B0000000000000000000000000000000000F03F
the_geom_mercator |
INSERT 0 1