繁体   English   中英

PostgreSQL - 在插入或更新时触发

[英]PostgreSQL - Trigger on INSERT or UPDATE

我不想在PostgreSQL数据库中添加触发器。 此触发器用于连接 2 列的值以更新第三列。 当在表中插入或更新行时,我不想运行它。

桌子

CREATE TABLE IF NOT EXISTS FILE(ID INT NOT NULL PRIMARY KEY, FOLDER TEXT, NAME TEXT, URL TEXT);

Function

CREATE OR REPLACE FUNCTION LINK() RETURNS trigger AS 
$$
BEGIN
  IF (TG_OP = 'UPDATE') THEN
    UPDATE FILE
    SET URL = CONCAT(FOLDER, NAME)
    WHERE ID = OLD.ID;
  ELSIF (TG_OP = 'INSERT') THEN
    UPDATE FILE   
    SET URL = CONCAT(FOLDER, NAME)
    WHERE ID = NEW.ID;
  END IF;
  RETURN NULL;
END
$$
LANGUAGE PLPGSQL;

扳机

CREATE TRIGGER TRIGGER_LINK
BEFORE INSERT OR UPDATE 
ON FILE
FOR EACH ROW 
EXECUTE PROCEDURE LINK();

当我在表中插入一个值时

INSERT INTO FILE VALUES (1, 'C:\', 'doc.pdf');

我有一个错误消息list index out of range ,因为尚未创建ID号并且INSERT上的UPDATE查询无法执行。 但是,如果我进行AFTER UPDATE它将无限运行。

如何使用ID上的WHERE子句在INSERTUPDATE上运行触发器 function 以仅针对插入或更新的行? 我正在使用PostgreSQL 10.14

不要使用 UPDATE 来做到这一点。 只需分配值。 此外,BEFORE 触发器不应返回null ,因为这将中止操作。

CREATE OR REPLACE FUNCTION LINK() RETURNS trigger AS 
$$
BEGIN
  new.url := CONCAT(new.FOLDER, new.NAME);
  RETURN new; --<< important!
END
$$
LANGUAGE PLPGSQL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM