【发布时间】:2020-06-21 17:32:48
【问题描述】:
我有两张表如下:
表 A:名称、ID、值
表 B:ID、标题
TableA.value 取决于TableA.ID 是否存在于TableB.ID 中。
我正在尝试创建一个过程和触发器,以便每当修改TableB 时,都会触发该过程以检查TableA.ID 是否在TableB.ID 中并将TableA.value 设置为10。
我正在使用以下代码并收到错误:
CREATE PROCEDURE update1
LANGUAGE SQL
AS $$
UPDATE tablA as a
SET a.value = 10
WHERE a.ID EXISTS ( SELECT b.ID
FROM tableB as b
WHERE a.ID = b.ID)
$$;
我是一个 SQL 菜鸟,这是我第一次尝试使用过程。
更新
当我使用 CALL 手动运行它时,我能够创建一个完成这项工作的过程
但是,其中没有RETURNS TRIGGER 块。添加返回错误Procedure cannot return triggers。
如果我按如下方式创建触发器
CREATE TRIGGER b_trigger
AFTER UPDATE OR INSERT ON b.ID
FOR EACH STATEMENT
EXECUTE PROCEDURE update1();
但是,这会返回以下内容
错误:函数 columbia_deli.manager_discount 必须返回类型触发器
SQL 状态:42P17
【问题讨论】:
-
您不需要创建过程来更新其他表中的行。仅使用触发器可以正常工作。只需创建一个 AFTER_UPDATE 触发器。 w3resource.com/PostgreSQL/postgresql-triggers.php
-
@Abhishek 在 PostgreSql 中,您必须为触发器编写一个函数。阅读博客
-
@AkhileshMishra :是的,你是对的,但 OP 实际上是在创建一个过程而不是函数。
-
正确.. 在 Postgresql 中,过程是在 11 版中引入的。早期只有功能
-
@AkhileshMishra 是的,我把他介绍给了博客。所以他可以深入了解 PostgreSQL 中的触发器。
标签: sql postgresql triggers