Postgresql 如何基于同一表中的其他列更改更新列值,而不使用表中的任何主键列
我有一个名为“custom_manual_edit”的表,其中有“name”、“builder”和“flag”列,其中没有主键的列。当用户更新builder列中的任何更改时,我编写了一个触发器,该触发器将调用一个函数,该函数应将更改了builder值的记录的标志列值更新为10 下面是我的扳机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
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;
.....
.....