Sql 触发函数IF-ELSE Postgres

Sql 触发函数IF-ELSE Postgres,sql,database,postgresql,triggers,Sql,Database,Postgresql,Triggers,我有以下触发因素: CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$ BEGIN IF (select number_itens from grup where NEW.gruop_id = group_id) != 0 THEN UPDATE gruop SET number_itens= (number_itens-1) WHERE gruop_id=NEW.gruop_id;

我有以下触发因素:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$
BEGIN
    IF (select number_itens from grup where NEW.gruop_id = group_id) != 0 THEN
    UPDATE gruop SET number_itens= (number_itens-1) WHERE gruop_id=NEW.gruop_id;
   END IF;
RETURN NEW;
END; $$
LANGUAGE plpgsql;

CREATE TRIGGER deleted_item
BEFORE DELETE ON item
FOR EACH ROW EXECUTE PROCEDURE record_deleted_item();

在我的if else子句中,我应该检查组表中的列值
number\u items
是否不是0。我怎么能检查它?我这样做会返回一个错误。

将其选择为变量并与零进行比较。您可能还需要检查
SELECT
是否实际返回了任何内容

DECLARE
    ni bigint;
BEGIN
    SELECT number_itens INTO ni FROM ...;
    IF NOT FOUND THEN
    END IF;
    IF NI != 0 THEN
    END IF;
END

我认为你根本不需要一个条件。如果
grup
中没有与
NEW.groop\u id=group\u id
匹配的内容,则更新根本不起作用,因此不需要两个查询:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$
BEGIN
    UPDATE gruop SET number_itens = (number_itens - 1) WHERE gruop_id = NEW.gruop_id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
上面假设
grup
只是一个输入错误,您只有一个
groop

此外,如果这真的是一个删除触发器,那么您将希望使用
旧的
,而不是
新的

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$
BEGIN
    UPDATE gruop SET number_itens = (number_itens - 1) WHERE gruop_id = OLD.gruop_id;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;