Postgresql 如何基于同一表中的其他列更改更新列值,而不使用表中的任何主键列

Postgresql 如何基于同一表中的其他列更改更新列值,而不使用表中的任何主键列,postgresql,triggers,plpgsql,postgresql-9.3,Postgresql,Triggers,Plpgsql,Postgresql 9.3,我有一个名为“custom_manual_edit”的表,其中有“name”、“builder”和“flag”列,其中没有主键的列。当用户更新builder列中的任何更改时,我编写了一个触发器,该触发器将调用一个函数,该函数应将更改了builder值的记录的标志列值更新为10 下面是我的扳机 CREATE TRIGGER builder_update_trigger_manual_custom_edits AFTER UPDATE ON edmonton.custom_manual_edit F

我有一个名为“custom_manual_edit”的表,其中有“name”、“builder”和“flag”列,其中没有主键的列。当用户更新builder列中的任何更改时,我编写了一个触发器,该触发器将调用一个函数,该函数应将更改了builder值的记录的标志列值更新为10 下面是我的扳机

CREATE TRIGGER builder_update_trigger_manual_custom_edits
AFTER UPDATE
ON edmonton.custom_manual_edit
FOR EACH ROW
WHEN (((old.builder)::text IS DISTINCT FROM (new.builder)::text))
EXECUTE PROCEDURE 
edmonton.automated_builder_update_trigger_manual_custom_edits();
以及我的职能

  CREATE OR REPLACE FUNCTION 
edmonton.automated_builder_update_trigger_manual_custom_edits()
RETURNS trigger AS
$BODY$
DECLARE
e record;

BEGIN
IF NEW.builder <> OLD.builder THEN
    EXECUTE FORMAT('UPDATE edmonton.custom_manual_edit set builder_edit_flag = 10;
END IF;
RETURN NEW;

 END 
 $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
创建或替换函数
edmonton.自动构建器更新触发器手动自定义编辑()
将触发器返回为
$BODY$
声明
e记录;
开始
如果是NEW.builder,则为OLD.builder
执行格式('UPDATE edmonton.custom_manual_edit set builder_edit_flag=10;
如果结束;
归还新的;
结束
$BODY$
语言plpgsql VOLATILE
成本100;

我知道这会将整个表标志列更新为10,但如何更新builder值已更改的记录的标志值。

请查看文档:

每语句触发器调用的触发器函数应始终 return NULL。每行触发器调用的触发器函数可以返回 调用执行器的表行(HeapTuple类型的值),如果 他们选择。在操作具有 以下选项

  • 它可以返回NULL以跳过当前行的操作。此 指示执行器不执行 调用触发器(插入、修改或删除 特定表行)

  • 仅对于行级插入和更新触发器,返回的行 成为将插入的行或将替换正在插入的行 已更新。这允许触发器函数修改正在更新的行 插入或更新。

触发器前的行级别,不打算导致 这些行为必须小心,以作为其结果返回同一行 传入的(即插入和更新的新行) 触发器,删除触发器的旧行)

根据上述规定,您必须:

  • 将触发器声明为更新前的,而不是更新后的
  • 直接在新行中更改
    builder\u edit\u标志
    列值
    ,而不是触发UPDATE语句


  • 创建或替换函数
    edmonton.自动构建器更新触发器手动自定义编辑()
    .....
    .....
    开始
    如果是NEW.builder,则为OLD.builder
    NEW.builder\u edit\u标志=10;
    如果结束;
    归还新的;
    .....
    .....
    
    非常感谢@krokodiiko
    CREATE TRIGGER builder_update_trigger_manual_custom_edits
    BEFORE UPDATE
    ON edmonton.custom_manual_edit
    FOR EACH ROW
    .....
    .....
    
    CREATE OR REPLACE FUNCTION 
    edmonton.automated_builder_update_trigger_manual_custom_edits()
    .....
    .....
    
    BEGIN
    IF NEW.builder <> OLD.builder THEN
        NEW.builder_edit_flag = 10;
    END IF;
    RETURN NEW;
    .....
    .....