在生成的列上处理 pg_error

Handle pg_error on generated columns

我有一个 table,其中包含一些 PostGIS 相关数据。这些数据在插入或更新时自动生成。

ALTER TABLE "Room" ADD COLUMN geolocation geography(Polygon, 4326) GENERATED ALWAYS AS (ST_MakePolygon("polygon"::geometry)) STORED;

有时多边形列上提供的数据可能不适合生成函数并导致错误。我想处理这个错误并在它失败时设置一个默认值。

-- 最后的选择--

  1. 创建 postgres 函数来处理此任务,但会使工作与代码库分离。

当您使用 ST_MakePolygon 时,我假设列 "polygon" 包含 LINESTRING,有时它们无效,这会在您的 DDL 语句中引发错误。

您可以做的是创建一个 CASE 条件,在尝试创建多边形之前验证几何。例如,此查询检查几何是否有效,是否为 LINESTRING 以及在尝试创建 POLYGON 之前其环是否闭合。如果失败,它会生成一个 (如果需要,将其更改为 NULL):

ALTER TABLE "Room" 
  ADD COLUMN geolocation geography(Polygon, 4326) 
  GENERATED ALWAYS AS (
    CASE 
      WHEN ST_IsValid("polygon") AND 
           GeometryType("polygon")='LINESTRING' AND
           ST_IsClosed("polygon"::geometry) THEN   
        ST_MakePolygon("polygon"::geometry)
      ELSE 
        'POLYGON EMPTY' 
      END) STORED;

演示:db<>fiddle