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它将无限运行。
如何在INSERT或UPDATE使用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)
| 归档时间: |
|
| 查看次数: |
1844 次 |
| 最近记录: |