【发布时间】: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 语句中使用
FROM:WHERE bo.bookname = new.bookname;就足够了。 -
@a_horse_with_no_name 我正在使用 pgAdmin 创建
标签: sql postgresql psql