5

我有一个包含多个字段的视图。

当我INSERT INTO查看视图时,我运行基于INSERT参数的函数。该函数返回一个值。

如何从规则中检索值?

INSERT RETURNING给我:

错误:无法对关系“full_subntes”执行 INSERT RETURNING
提示:您需要一个带有 RETURNING 子句的无条件 ON INSERT DO INSTEAD 规则。

例子:

CREATE TABLE test (
    a VARCAHR primary key,
    b VARCHAR,
);

CREATE VIEW test_v AS SELECT * FROM test;

CREATE OR REPLACE RULE Test_v_Insert AS ON INSERT TO Test_v
DO INSTEAD (
    SELECT myFunction('param');
);

INSERT INTO test_v(a, b) VALUES ('a', 'b') RETURNING a, b;

然后我收到上述错误。

4

2 回答 2

3

这是一个例子。

首先,我们创建一个测试表:

CREATE TABLE test (a integer, b varchar, primary key (a));

然后,我们创建一个视图:

CREATE OR REPLACE VIEW test_view AS SELECT * FROM test;

接下来,创建更新规则:

CREATE OR REPLACE RULE rl_test_view_update AS
    ON UPDATE TO test_view DO INSTEAD
    UPDATE test SET a = NEW.a, b = NEW.b
    WHERE test.a = old.a AND test.b = old.b;

最后,这是插入规则:

CREATE OR REPLACE RULE rl_test_view_insert AS
    ON INSERT TO test_view DO INSTEAD
    INSERT INTO test VALUES (NEW.a, NEW.b)
    RETURNING test.*;

现在您可以插入一些测试数据:

INSERT INTO test_view (a, b) VALUES (1,'John Doe') RETURNING a;

并检查插入的元组:

SELECT * FROM test_view;
于 2010-05-24T20:04:48.293 回答
-1

为了更新 Postgres 中的视图,您需要定义一条规则,告诉它更新基表。听起来您还没有创建规则。http://www.postgresql.org/docs/current/interactive/rules-update.html

于 2010-05-24T15:26:42.203 回答