CREATE RULE
功能描述
定义一个新的重写规则。
注意事项
- 为了在表上定义或修改规则,你必须是该表的拥有者。
- 如果在同一个表定义了多个相同类型的规则,则按规则的名称字母顺序触发它们。
- 在视图上用于INSERT、UPDATE、DELETE的规则中可以添加RETURNING子句基于视图的字段返回。如果规则被INSERT RETURNING、UPDATE RETURNING、DELETE RETURNING命令触发,这些子句将用来计算输出结果。如果规则被不带RETURNING的命令触发,那么规则的RETURNING子句将被忽略。目前仅允许无条件的INSTEAD规则包含RETURNING子句,而且在同一个事件内的所有规则中最多只能有一个RETURNING子句。这样就确保只有一个RETURNING子句可以用于计算结果。如果在任何有效规则中都不存在RETURNING子句,该视图上的RETURNING查询将被拒绝。
- 目前,ON SELECT规则必须是无条件的INSTEAD规则并且必须有一个由单独一条SELECT查询组成的动作。因此,一条ON SELECT规则实际上把表变成了一个视图,它的可见内容是由该规则的SELECT命令返回,而不是直接存在该表中的内容(如果有)。
语法格式
CREATE [ OR REPLACE ] RULE name AS ON event TO table_name [ WHERE condition ] DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) };
其中event包含以下几种:
SELECT INSERT DELETE UPDATE
参数说明
- name
取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。
- event
- table_name
- condition
返回boolean的SQL条件表达式,决定是否实际执行规则。表达式除了引用NEW和OLD之外不能引用任何表,并且不能有聚合函数。不建议使用int等数值类型作为condition,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。
- INSTEAD
- ALSO
- command
示例
--创建表tbl_rule1和tbl_rule2用于创建RULE。 gaussdb=# CREATE TABLE tbl_rule1(c1 int,c2 int,c3 int, c4 int); gaussdb=# CREATE TABLE tbl_rule2(c1 int,c2 int); --创建规则rule_test,ALSO指定命令在初始事件执行之后在执行。 gaussdb=# CREATE RULE rule_test AS ON INSERT TO tbl_rule1 DO ALSO INSERT INTO tbl_rule2 VALUES (new.c1, new.c2); --向tbl_rule1插入数据,并查看两张表的数据。 gaussdb=# INSERT INTO tbl_rule1 VALUES(1,11,111,1111), (2,22,222,2222); gaussdb=# SELECT * FROM tbl_rule1; c1 | c2 | c3 | c4 ----+----+-----+------ 1 | 11 | 111 | 1111 2 | 22 | 222 | 2222 (2 rows) gaussdb=# SELECT * FROM tbl_rule2; c1 | c2 ----+---- 1 | 11 2 | 22 (2 rows) --删除规则。 gaussdb=# DROP RULE rule_test ON tbl_rule1; --删除表。 gaussdb=# DROP TABLE tbl_rule1; gaussdb=# DROP TABLE tbl_rule2;
- ON SELECT 后指定的规则名必须为"_RETURN"
- 目前,ON SELECT规则必须是INSTEAD SELECT,而且TO所指定的表会被转为视图,前提是该表为空且不带有触发器、索引、子表等限制,也即必须为一张初始的空表。因此,一般不建议采用这种写法,而是直接创建视图。