选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.2 已于 2017 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

37.5. 规则和命令状态 #

PostgreSQL服务器会为收到的每条命令返回一个命令状态字符串,例如INSERT 149592 1。在没有规则参与时,这很简单;但当查询被规则重写时会发生什么呢?

规则对命令状态的影响如下:

  • 如果该查询没有无条件的INSTEAD规则,那么原始给出的查询就会照常执行,并返回它自身的命令状态。(但请注意,如果存在任何带条件的INSTEAD规则,那么这些规则条件的取反会被加到原始查询上。这可能会减少它处理的行数,从而影响报告的状态。)

  • 如果该查询存在任意无条件的INSTEAD规则,那么原始查询将完全不会执行。在这种情况下,服务器会返回由INSTEAD规则(带条件或不带条件)插入的、最后一条且与原始查询具有相同命令类型(INSERTUPDATEDELETE)的查询的命令状态。如果没有任何规则添加出满足这些条件的查询,那么返回的命令状态会显示原始查询类型,并且把行计数和 OID 字段都置零。

(这套机制是在 PostgreSQL 7.3 中确立的。在那之前的版本中,存在规则时命令状态可能会显示不同的结果。)

在第二种情况下,程序员可以通过为所需的INSTEAD规则指定一个在活动规则中按字母顺序排在最后的规则名,来确保由它设置命令状态,因为它会最后被应用。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。