PostgreSQL更新触发器

我有一张桌子:
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?

那你就不需要了.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...