sql - PostgreSQL 上的简单更新触发器返回错误

标签 sql postgresql triggers

CREATE FUNCTION update_status() RETURNS TRIGGER AS ' 
BEGIN 
SELECT status FROM animals
IF status = "Alive" 
THEN 
UPDATE animals SET status = "Sold" WHERE status="Alive";   
END IF;   
RETURN NULL; 
END; ' LANGUAGE plpgsql;  

CREATE TRIGGER updatetrigger AFTER UPDATE OF id_selling ON animals EXECUTE PROCEDURE     update_status(); 

它说我没有使用选定的属性,我应该使用 Perform 而不是 Select。但是在执行后它不识别 IF。我对这些语法真的很陌生,所以它可能是错误的。我想我想做什么很清楚(我相信对于有经验的人来说这很简单)。你能帮我解决这个问题吗?

最佳答案

在标准 SQL(和 PostgreSQL)中,这是一个带引号的标识符(表名、列名……):

"Alive"

这是一个字符串文字:

'Alive'

您将收到有关“未知列”的投诉,因为您对字符串使用了错误的引号。

函数通常定义为 dollar-quoting避免这种事情:

CREATE FUNCTION update_status() RETURNS TRIGGER AS $$
BEGIN 
    SELECT status FROM animals
    IF status = 'Alive' THEN 
        UPDATE animals SET status = 'Sold' WHERE status = 'Alive';   
    END IF;   
    RETURN NULL; 
END;
$$ LANGUAGE plpgsql;

Triggers have access to NEW and OLD要表示行的先前/当前状态和行的新/更新状态,您应该咨询那些而不是尝试 SELECT 来查找状态:

CREATE FUNCTION update_status() RETURNS TRIGGER AS $$
BEGIN 
    IF NEW.status = 'Alive' THEN 
        UPDATE animals SET status = 'Sold' WHERE status = 'Alive';   
    END IF;   
    RETURN NULL; 
END;
$$ LANGUAGE plpgsql;

您可能还想在该 UPDATE 的 WHERE 子句中多一点,只是 WHERE status = 'Alive' 似乎有点宽泛。

关于sql - PostgreSQL 上的简单更新触发器返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13349426/

相关文章:

javascript - 在 MYSQL 查询中使用多个参数替换时出现语法错误

mysql - 让我们看看你是否能解决这个问题,打开元素 hell

performance - PostgreSQL 可扩展性 : Towards Millions TPS

MySQL - 每次选择行时更新 View 列

sql - SQL Server 是否真的计算 case 表达式中的每个 'then' 子句?

sql - 当数据库查询出错时检测并处理

postgresql - 官方 Postgres 镜像如何使用环境变量创建用户和数据库?

sql - 如何在 SQL 中连接这些表

wpf - 为什么 IsMouseOver 被识别而 MouseDown 不是(Wpf 样式触发器)?

jenkins - 如何使用 Github Webhook 触发 Jenkins 中的管道