PostgreSQL的规则系统
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/database/postgresql_rule_system.html
PostgreSQL提供了一种叫做规则(Rule)的机制,来实现一些与触发器不同的更加自定义的功能。规则系统介于查询编译器和执行优化器之间,根据规则及修改查询。
基本语法:
CREATE RULE 规则名 AS
ON {SELECT | INSERT | UPDATE | DELETE}
TO 表名 [WHERE 规则条件]
DO [INSTEAD] {NOTHING | 命令 | (命令, 命令...)}
PostgreSQL中的视图实际上就是通过RULE来实现的。
例如建立一个视图:
CREATE VIEW view_1 AS SELECT * FROM table_1;
PostgreSQL实际将这个语句翻译为规则:
CREATE TABLE table_view_1 (涉及的列名);
CREATE RULE return AS
ON SELECT TO table_view_1 DO INSTEAD
SELECT * FROM table_1;
这样在查询view_1视图时,PostgreSQL实际上把它转换为对隐含的表table_view_1的查询。
在仅仅需要查询的时候,CREATE VIEW是更合适的语法,但是这这样建立的视图是不能做修改操作的,但是通过规则是可以做到的。
例如我们要更新view_1视图:
CREATE TABLE table_view_1 (涉及的列名);
CREATE RULE update_view_1 AS
ON UPDATE TO table_view_1
DO UPDATE table_1 SET col_1 = new.col_1
WHERE col_2 = new.col_2;
有了这样的规则,我们执行UPDATE view_1 SET col_1=x WHERE col_2=y;的时候,实际上就更新了table_1,这样就实现了更新视图。对于多表的视图,也可以这样操作。