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

4

1 回答 1

4

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

"Alive"

这是一个字符串文字:

'Alive'

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

函数通常用美元引用来定义以避免这种事情:

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;

触发器可以访问 NEW 和 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'看起来有点宽泛。

于 2012-11-12T19:00:43.927 回答