【问题标题】:Using a procedure to update Column 2 in a Table A, by checking if column 1 value is present in a column in Table B [PostgreSQL]使用过程更新表 A 中的第 2 列,通过检查表 B 中的列中是否存在第 1 列值 [PostgreSQL]
【发布时间】: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


【解决方案1】:

使用plpgsql 语言试试这个:

触发功能:

CREATE OR REPLACE FUNCTION update1()
  RETURNS trigger AS
$BODY$
 
begin
update "TableA" set value= 10 where id =new.id;

return NEW;
end;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

然后在TableB 上为after update 事件创建触发器

CREATE TRIGGER trig_tableb
  AFTER UPDATE
  ON "TableB"
  FOR EACH ROW
  EXECUTE PROCEDURE update1();

【讨论】:

  • 谢谢。当我尝试类似的事情时,会出现一个错误,提示 Functions cannot return triggers。
  • @KarthicSubramanian:那么看来您没有使用 Postgres。 select version(); 向您展示了什么?
  • PostgreSQL 12.3 (Debian 12.3-1.pgdg100+1) on x86_64-pc-linux-gnu,由 gcc (Debian 8.3.0-6) 8.3.0 编译,64 位
  • @KarthicSubramanian:你需要使用函数,而不是触发器的过程
  • @KarthicSubramanian 我认为您使用的是 SQL 语言。请使用语言plpgsqlSQL 语言会出现此错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 2022-08-15
  • 1970-01-01
相关资源
最近更新 更多