为什么不遵守PostgreSQL规则条件?

为什么不遵守PostgreSQL规则条件?,postgresql,rules,Postgresql,Rules,考虑下表: 创建表testid int主键,测试文本; 创建表test\u histid serial、id\u test int、test text; 我创建了以下规则: 创建规则test\u ins AS ON INSERT TO test WHERE exists从test WHERE test.id=new.id中选择id,改为更新test SET test=new.test WHERE id=new.id; 创建规则test\u upt AS ON UPDATE TO test也插入t

考虑下表:

创建表testid int主键,测试文本; 创建表test\u histid serial、id\u test int、test text; 我创建了以下规则:

创建规则test\u ins AS ON INSERT TO test WHERE exists从test WHERE test.id=new.id中选择id,改为更新test SET test=new.test WHERE id=new.id; 创建规则test\u upt AS ON UPDATE TO test也插入test\u histid\u test,test VALUES old.id,old.test; 为什么当我在测试中插入一个条目时,它也在执行更新?当我执行插入操作时,测试历史中也会插入一个条目

如果我创建这样的规则:

在插入时创建规则测试插件以测试存在的位置从测试中选择id,其中test.id=new.id不执行任何操作; 它按预期工作,什么也不做。是否插入并检查规则上的条件


我最初的想法是将ON CONFLICT用于insert,但当存在用于更新或插入的规则时,无法执行该操作。这是为什么?

当您尝试创建id已存在的测试记录时,它会根据您的第一条规则进行更新。您确定插入内容没有提供已经存在的id吗?这可能发生在并发访问场景中。@LajosArpad我正在cli中尝试此操作。。。它甚至还不是一个应用程序。。。是的,如果密钥已经存在,则更新。当更新发生时,旧的条目将进入历史记录表。问题是,如果你创建这个表并插入一个新条目,它也会在历史记录中结束,因此执行这两条规则。首先,不要使用规则,它们只会让你的生活变得悲惨。其次,使用ON CONFLICT和触发器写入历史文件。