簡體   English   中英

創建一個更新另一個表的列的觸發器(Postgresql)

[英]Create a trigger that updates the columns of another table (Postgresql)

所以我有兩個表“books”和“bookOrder”,它們看起來像這樣:

書單

訂單號 書名 必需的 可用性
1 哈利波特 9 是的
2 8 是的
3 聖經 8 是的

圖書

書名 數量
哈利波特 10
5
聖經 8

我想創建一個觸發器,每次更新圖書表時,它都會根據圖書數量列更新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

但是,如果這是自動的會更好,所以我首先想到的是觸發器。 要創建觸發器,我需要一個 function 來執行。 這是我在創建 function 時遇到麻煩的地方。 我的嘗試如下:

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;

我在 ($$) 所在的最后一行出現錯誤。 不確定為什么。 甚至不確定這是否是創建觸發器的正確格式。

先謝謝了!

在 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 | 是的

這里測試 db<>fiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM