CREATE RULE
CREATE RULE¶
定义新的重写规则。
- 语法
sql CREATE [OR REPLACE] RULE name AS ON event TO table_name [WHERE condition] DO [ALSO | INSTEAD] { NOTHING | command | (command; command ...) }
- 描述
-
CREATE RULE
定义了应用于指定表或视图的新规则。CREATE OR REPLACE RULE
将创建一个新规则,或为同一表替换一个具有相同名称的现有规则。SeaboxMPP数据库规则系统允许定义对数据库表中的插入,更新或删除执行的另一种操作。当执行给定表上的给定命令时,规则将导致执行附加或替代命令。
INSTEAD
规则可以用另一个命令替换给定命令,或导致根本不执行命令。 规则也可以用于实现SQL视图。重要的是要认识到规则实际上是命令转换机制或命令宏。转换发生在命令执行开始之前。 它不会像触发器那样针对每个物理行独立运行。
ON SELECT
规则必须是无条件的INSTEAD
规则,并且必须具有由单个SELECT
命令组成的操作。 因此,ON SELECT
规则有效地将表变成视图, 其可见内容是规则的SELECT
命令返回的行,而不是表中存储的内容(如果有的话)。与创建真实表并为其定义ON SELECT
规则相比, 写CREATE VIEW
命令被认为是更好的样式。您可以通过定义
ON INSERT
,ON UPDATE
和ON DELETE
规则将视图上的更新操作替换为其他表上的适当更新,来创建可更新视图的错觉。 如果要支持INSERT RETURNING
等,请确保在每个规则中放入合适的RETURNING
子句。如果尝试使用条件规则进行视图更新,则有一个陷阱: 要允许在视图上执行的每个操作都必须有一个无条件的
INSTEAD
规则。如果规则是有条件的,或者不是
INSTEAD
,则系统仍将拒绝执行更新操作的尝试,因为它认为在某些情况下可能最终尝试对视图的虚拟表执行操作。如果要处理条件规则中的所有有用情况,请添加无条件的
DO INSTEAD NOTHING
规则, 以确保系统理解它将永远不会被调用它来更新虚拟表。 然后将条件规则设为non-INSTEAD
; 在应用它们的情况下,它们会添加到默认的INSTEAD NOTHING
操作中。(但是,该方法当前不适用于支持RETURNING
查询。)- 注意: 这是很简单的自动更新的视图(参见
CREATE VIEW
)以可更新并不需要用户创建的规则。尽管仍然可以创建显式规则,但是自动更新转换通常会胜过显式规则。
- 注意: 这是很简单的自动更新的视图(参见
- 参数
-
该SQL命令参数说明见下
name
- 要创建的规则的名称。 此名称必须与同一表的任何其他规则的名称不同。 同一表和同一事件类型上的多个规则以字母名称顺序应用。
event
- 该事件是
SELECT
,INSERT
,UPDATE
或DELETE
之一。 table_name
- 规则所适用的表或视图的名称(可以由模式指定)。
condition
-
任何SQL条件表达式(返回布尔值)。 条件表达式可能不引用除
NEW
和OLD
以外的任何表,并且可能不包含聚合函数。NEW
和OLD
引用参考表中的值。NEW
在ON INSERT
和ON UPDATE
规则中有效,以引用要插入或更新的新行。OLD
在ON UPDATE
和ON DELETE
规则中有效,以引用要更新或删除的现有行。 INSTEAD
INSTEAD NOTHING
指示应执行的命令而不是原始命令。ALSO
ALSO
指示除了原始命令外,还应该执行命令。 如果未指定ALSO
或INSTEAD
,则默认为ALSO
。command
-
组成规则操作的一个或多个命令。 有效的命令是
SELECT
,INSERT
,UPDATE
或DELETE
。特殊表名
NEW
和OLD
可以用来引用引用表中的值。NEW
在ON INSERT
和ON UPDATE
规则中有效,以引用要插入或更新的新行。OLD
在ON UPDATE
和ON DELETE
规则中有效,以引用要更新或删除的现有行。
- 注解
-
必须是表的所有者才能创建或更改该表的规则。
注意避免循环规则非常重要。递归规则在规则创建时未得到验证,但是将在执行时报告错误。
- 示例
-
创建一个规则,当用户尝试向分区的父表
rank
中插入行时,将行插入到子表b2001
中:CREATE RULE b2001 AS ON INSERT TO rank WHERE gender='M' and year='2001' DO INSTEAD INSERT INTO b2001 VALUES (NEW.id, NEW.rank, NEW.year, NEW.gender, NEW.count);
- 兼容性说明
CREATE RULE
是SeaboxMPP数据库语言的扩展,整个查询重写系统也是如此。- 相关SQL命令
ALTER RULE
,DROP RULE
,CREATE TABLE
,CREATE VIEW