PostgreSQL:仅更新插入的行

3

我需要设置一个“ON INSERT”规则,该规则将更新插入行中的一列(而不是更新整个条目集的列):

CREATE OR REPLACE RULE _myrule AS ON INSERT TO myTable DO UPDATE myTable SET col1 = 'test' ;

以上语句将为所有条目设置“test”字符串...我不知道如何在规则语法中指定此内容。
提前感谢您的帮助!

你需要添加类似 where pk_column = new.pk_column 的内容来限制更新。手册中有一个示例:http://www.postgresql.org/docs/current/static/rules-update.html(需要向下滚动相当多的内容)。 - user330315
在几乎所有情况下,你应该使用触发器而不是规则来处理这种事情。它们更容易正确实现。 - Craig Ringer
1个回答

0

1)第一种解决方案(使用触发器)

CREATE OR REPLACE FUNCTION myRule() RETURNS trigger as $myRule$
   BEGIN
    NEW.col1 := 'test';
    RETURN NEW;
  END;
$myRule$
LANGUAGE plpgsql;



 -- DROP  TRIGGER myRule ON "myTable";

 CREATE TRIGGER myRule 
 BEFORE INSERT 
 ON "myTable"
 FOR EACH ROW 
 EXECUTE PROCEDURE myRule();

2) 第二种解决方案(使用规则)

id - 在此处放置您的主键名称

CREATE OR REPLACE RULE  myTable_ins AS ON INSERT TO "myTable"
  DO ALSO
    UPDATE "myTable" SET 
        col1 = 'test'
    WHERE id = NEW.id       
;

1
他/她想将一个“插入”转换为“更新” - 在插入期间不提供默认值。另外:“test”是一个列名,而不是字符串字面量。“'test'”是一个字符串字面量。 - user330315
不,我想把“update”变成“insert”!@a_horse_with_no_name的解决方案似乎是正确的,但对我不起作用:UPDATE myTable SET col1 = 'test' WHERE gid = NEW.gid;。插入运行后,“col1”仍然为空。 - wiltomap
1
@wiltomap:“我想将更新转换为插入”与您在问题中展示的代码相矛盾,该代码将插入转换为更新。但是再次强调:Postgres手册中有这两个问题的示例。 - user330315
在我提供的解决方案中,插入新行后,您将在这些新行的col1中拥有值“test”。这是否符合您的需求? - Andrzej Reduta
谢谢@Andrzej,但我更喜欢一个更简单的方法来处理它。我想做的就是我在问题中提出的,对于误解我感到抱歉。我在手册中找不到这个例子。我的上一条评论陈述有什么问题吗? - wiltomap
对于两者都可以实现的事情,哪个更好取决于数据库的使用。触发器在每次受影响的行上只触发一次。规则操作查询或生成额外的查询。因此,如果一个语句中有多行受到影响,则发出一个额外命令的规则可能比为每个单独的行调用的触发器更快,并且必须执行其操作多次。但是,触发器方法在概念上比规则方法简单得多,并且对于新手来说更容易掌握。 - Andrzej Reduta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接