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