【问题标题】:Create a trigger that updates the columns of another table (Postgresql)创建一个更新另一个表的列的触发器(Postgresql)
【发布时间】:2022-01-10 10:14:54
【问题描述】:

我有两个表“books”和“bookOrder”,它们看起来像这样:

bookOrder

orderID book name required availability
1 Harry Potter 9 yes
2 Twilight 8 yes
3 Bible 8 yes

书籍

book name quantity
Harry Potter 10
Twilight 5
Bible 8

我想创建一个触发器,每次更新 books 表时,它都会根据 book 数量列更新 bookorder 可用性列。

我创建了一个查询,如下所示:

UPDATE bookOrder bo
SET avalability = CASE WHEN b.quantity < bo.required THEN 'NO' ELSE 'YES' END
FROM books b
WHERE b.bookName = bo.bookName

但是,如果这是自动的,那就更好了,所以我首先想到的是触发器。要创建触发器,我需要一个函数来执行。这是我在创建函数时遇到问题的地方。我的尝试如下:

CREATE OR REPLACE FUNCTION update_books() RETURNS TRIGGER AS $$
    BEGIN
        UPDATE bookOrder bo
        SET avalability = CASE WHEN b.quantity < bo.required THEN 'NO' ELSE 'YES' END
        FROM books b
        WHERE b.bookName = bo.bookName
    END
$$  LANGUAGE plpgsql;

为什么在 ($$) 所在的最后一行出现错误?

【问题讨论】:

  • 您是使用psql 还是其他客户端来创建触发功能?并非所有 SQL 客户端都支持 Postgres 的美元报价。
  • 不相关,但是:您不需要在 UPDATE 语句中使用 FROMWHERE bo.bookname = new.bookname; 就足够了。
  • @a_horse_with_no_name 我正在使用 pgAdmin 创建

标签: sql postgresql psql


【解决方案1】:

在 WHERE 子句后添加分号后编译的过程。
它还必须返回一些东西。

但更新不需要在书籍更新时更新目标表中的每一行。

CREATE OR REPLACE FUNCTION update_bookorder_availability() 
RETURNS TRIGGER
AS $$
BEGIN

  UPDATE bookOrder bo
  SET availability = CASE 
                     WHEN bo.required <= NEW.quantity THEN 'yes' 
                     ELSE 'no' 
                     END
  WHERE bo.bookName = NEW.bookName;
  
  RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER bookorder_availability_changes
  AFTER UPDATE
  ON books
  FOR EACH ROW
  EXECUTE PROCEDURE update_bookorder_availability();
-- before update
select * from books;
select * from bookOrder;
书名 |数量 :----------- | --------: 哈利波特 | 10 暮光之城 | 5 圣经 | 8 订单号 |书名 |必填 |可用性 ------: | :----------- | --------: | :----------- 1 |哈利波特 | 9 |是的 2 |暮光之城 | 8 |是的 3 |圣经 | 8 |是的
update books set quantity = quantity;
3 行受影响
-- after update
select * from books;
select * from bookOrder;
书名 |数量 :----------- | --------: 哈利波特 | 10 暮光之城 | 5 圣经 | 8 订单号 |书名 |必填 |可用性 ------: | :----------- | --------: | :----------- 1 |哈利波特 | 9 |是的 2 |暮光之城 | 8 |不 3 |圣经 | 8 |是的

测试 dbfiddle here

【讨论】:

  • 谢谢!这真的很好。我看到你的效率比我的高得多,我必须记住这一点,干杯!
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2018-01-12
相关资源
最近更新 更多