加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL更新触发器

发布时间:2020-12-13 18:09:51 所属栏目:百科 来源:网络整理
导读:我有一张桌子: CREATE TABLE annotations( gid serial NOT NULL,annotation character varying(250),the_geom geometry,"rotationAngle" character varying(3) DEFAULT 0,CONSTRAINT annotations_pkey PRIMARY KEY (gid),CONSTRAINT enforce_dims_the_geom
我有一张桌子:
CREATE TABLE annotations
(
  gid serial NOT NULL,annotation character varying(250),the_geom geometry,"rotationAngle" character varying(3) DEFAULT 0,CONSTRAINT annotations_pkey PRIMARY KEY (gid),CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)
)

并触发:

CREATE TRIGGER set_angle
AFTER INSERT OR UPDATE
ON annotations
FOR EACH ROW
EXECUTE PROCEDURE setangle();

功能:

CREATE OR REPLACE FUNCTION setAngle() RETURNS TRIGGER AS $$
BEGIN
IF    TG_OP = 'INSERT' THEN
    UPDATE annotations SET "rotationAngle" = degrees( ST_Azimuth( ST_StartPoint(NEW.the_geom),ST_EndPoint(NEW.the_geom) ) )-90 WHERE gid = NEW.gid;
    RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
    UPDATE annotations SET "rotationAngle" = degrees( ST_Azimuth( ST_StartPoint(NEW.the_geom),ST_EndPoint(NEW.the_geom) ) )-90 WHERE gid = NEW.gid;
    RETURN NEW;
END IF;
END;
$$LANGUAGE plpgsql;

当在表格或行中插入新行时,我想要使用函数结果设置字段rotationAngle.
但是当我在表函数中插入新行时不起作用.我的意思是,rotationAngle值没有改变.

有什么不对?

作为 @SpartanElite pointed out,你正在触发一个无限循环.

简化触发功能:

CREATE OR REPLACE FUNCTION set_angle()
  RETURNS TRIGGER AS
$func$
BEGIN
   NEW."rotationAngle" := degrees(
                             ST_Azimuth(
                                ST_StartPoint(NEW.the_geom),ST_EndPoint(NEW.the_geom)
                             )
                          ) - 90;
   RETURN NEW;
END
$func$LANGUAGE plpgsql;

>直接分配给NEW.在这种情况下没有.
>您必须双引号非法列名称.最好不要使用这些名称.
Recent related answer.
>插入代码&升级是一样的.我折叠成一个代码路径.

使用BEFORE触发器.这样,您可以在保存之前直接编辑触发行的列:

CREATE TRIGGER set_angle
BEFORE INSERT OR UPDATE ON annotations
FOR EACH ROW EXECUTE PROCEDURE set_angle();

然而

如果您只是试图在表中保持功能相关的值(并且没有其他考虑因素):不要.改为使用视图或生成的列:

> Store common query as column?

那你就不需要了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读