我有这个表,其中一列用同一个表的其他列填充值(这些其他列表示我想在其他列中存储的最低级别的分类层次结构)。
为实现这一目标,我实施了以下触发器:
CREATE OR REPLACE FUNCTION get_taxon()
RETURNS TRIGGER LANGUAGE plpgsql AS
$BODY$
BEGIN
UPDATE taxon SET taxon = coalesce(subespecie, especie, genero, subfamilia, familia, infraordem, subordem, ordem, superordem, subclasse, classe, subphylum, phylum, reino )
WHERE taxon IS NULL;
RETURN NEW;
END
$BODY$
VOLATILE;
CREATE TRIGGER update_taxon
AFTER INSERT OR UPDATE ON taxon
FOR EACH STATEMENT
WHEN (pg_trigger_depth() = 0) -- Prevent recursive trigger calls
EXECUTE PROCEDURE get_taxon();
当我插入新记录时,触发器按预期工作,但如果我更新现有记录,则没有任何反应 - 触发器只是忽略UPDATE操作而我不知道原因。
有人可以对此有所了解吗?
答案 0 :(得分:1)
在您的语句触发器首次触发后,表中的所有记录都应使用最佳可用信息更新其taxon
字段。更新记录时,您可能希望更新taxon
值,但最好使用BEFORE INSERT OR UPDATE FOR EACH ROW
触发器。当然,唯一的新数据包含在触发器触发的行中。所以试试这个:
CREATE OR REPLACE FUNCTION get_taxon()
RETURNS TRIGGER LANGUAGE plpgsql AS
$BODY$
BEGIN
NEW.taxon := coalesce(NEW.subespecie, NEW.especie, NEW.genero, NEW.subfamilia,
NEW.familia, NEW.infraordem, NEW.subordem, NEW.ordem, NEW.superordem,
NEW.subclasse, NEW.classe, NEW.subphylum, NEW.phylum, NEW.reino);
RETURN NEW;
END;
$BODY$ VOLATILE;
CREATE TRIGGER update_taxon
BEFORE INSERT OR UPDATE ON taxon
FOR EACH ROW EXECUTE PROCEDURE get_taxon();