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

时间:2012-11-12 18:35:55

标签: 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。我对这些语法很新,所以它可能是错的。我认为它清楚我想做什么(我相信对于有经验的人来说很简单)。你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

在标准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'似乎有点宽泛。