【发布时间】:2014-03-24 23:28:40
【问题描述】:
我试图在 Postgres v9.4 中允许将带有返回子句的语句插入到视图中,但在语法上遇到了困难。这就是我想调用插入语句的方式:
CREATE VIEW MyView AS SELECT a.*, b.someCol1
FROM tableA a JOIN tableB b USING(aPrimaryKey);
INSERT INTO MyView (time, someCol) VALUES (someTime, someValue) RETURNING *;
INSERT INTO MyView (someCol) VALUES (someValue) RETURNING *;
请注意,时间的默认值是 NOW()。这是我目前所拥有的:
CREATE RULE MyRuleName AS ON INSERT TO MyView DO INSTEAD (
INSERT INTO tableA (time) VALUES COALESCE(NEW.time, NOW());
INSERT INTO tableB (aPrimaryKey, someCol)
VALUES (CURRVAL('tableA_aPrimaryKey_seq'), NEW.someValue);
);
以上方法可以插入值,但我正在努力尝试找出如何添加返回语句。我尝试了以下方法但没有成功:
CREATE RULE MyRuleName AS ON INSERT TO MyView DO INSTEAD (
INSERT INTO tableA (time) VALUES COALESCE(NEW.time, NOW())
RETURNING *, NEW.someValue;
INSERT INTO tableB (aPrimaryKey, someCol)
VALUES (CURRVAL('tableA_aPrimaryKey_seq'), NEW.someValue);
);
-- ERROR: invalid reference to FROM-clause entry for table "new"
CREATE RULE MyRuleName AS ON INSERT TO MyView DO INSTEAD (
WITH a AS (INSERT INTO tableA (time)
VALUES COALESCE(NEW.time, NOW()) RETURNING *)
INSERT INTO tableB (aPrimaryKey, someCol)
SELECT aPrimaryKey, NEW.someValue FROM a RETURNING *;
);
-- ERROR: cannot refer to NEW within WITH query
啊!有谁知道添加返回语句的方法,该语句在第一次插入中将主键(SERIAL)和时间(TIMESTAMP WITH TIME ZONE)添加到数据库中,以及第二次插入中 someCol 的值?谢谢!
【问题讨论】:
-
我强烈建议您为此使用
ON UPDATE DO INSTEAD触发器,而不是规则。
标签: postgresql sql-insert sql-returning