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/