PostgreSQL - 在插入或更新时触发

Geo*_*yro 1 postgresql triggers

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

桌子

CREATE TABLE IF NOT EXISTS FILE(ID INT NOT NULL PRIMARY KEY, FOLDER TEXT, NAME TEXT, URL TEXT);
Run Code Online (Sandbox Code Playgroud)

功能

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;
Run Code Online (Sandbox Code Playgroud)

扳机

CREATE TRIGGER TRIGGER_LINK
BEFORE INSERT OR UPDATE 
ON FILE
FOR EACH ROW 
EXECUTE PROCEDURE LINK();
Run Code Online (Sandbox Code Playgroud)

当我在表中插入一个值时,例如

INSERT INTO FILE VALUES (1, 'C:\', 'doc.pdf');
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,list index out of range因为ID尚未创建号码并且无法执行UPDATE查询。INSERT但如果我做了一个,AFTER UPDATE它将无限运行。

如何在INSERTUPDATE使用WHERE子句运行触发器函数ID以仅定位插入或更新的行?我在用着PostgreSQL 10.14

小智 5

不要使用 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;
Run Code Online (Sandbox Code Playgroud)