我有以下触发器:
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_items
是否不是0.我怎么检查它?我做的方式让我错了。
答案 0 :(得分:1)
我认为你根本不需要条件。如果grup
中没有任何内容与NEW.gruop_id = group_id
匹配,则UPDATE根本不会执行任何操作,因此不需要两个查询:
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
只是一个拼写错误而您只有一个gruop
表。
此外,如果这确实是DELETE触发器,那么您将希望使用OLD
代替NEW
:
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;
答案 1 :(得分:0)
SELECT
将其变为变量并与零进行比较。您可能还想检查SELECT
是否实际返回了任何内容。
DECLARE
ni bigint;
BEGIN
SELECT number_itens INTO ni FROM ...;
IF NOT FOUND THEN
END IF;
IF NI != 0 THEN
END IF;
END