[英]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.