Jef*_*f G 6 postgresql sql-insert sql-returning
我试图允许带有返回子句的insert语句进入Postgres v9.4中的视图,但我正在努力学习语法.这就是我想要调用insert语句的方法:
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 *;
Run Code Online (Sandbox Code Playgroud)
请注意,时间的默认值为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);
);
Run Code Online (Sandbox Code Playgroud)
上面的工作是插入值,但我正在努力尝试找出如何添加返回的语句.我试过以下没有成功:
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
Run Code Online (Sandbox Code Playgroud)
哎呀!有没有人知道一种方法来添加一个返回语句,该语句将第一个插入中的主键(SERIAL)和时间(TIMESTAMP WITH TIME ZONE)添加到数据库中,以及第二个插入中的someCol值?谢谢!
你最好INSTEAD OF INSERT在这里使用触发器:
CREATE FUNCTION MyFuncName() RETURNS trigger AS $$
DECLARE
id integer;
BEGIN
INSERT INTO tableA (time) VALUES COALESCE(NEW.time, NOW()) RETURNING aPrimaryKey INTO id;
INSERT INTO tableB (aPrimaryKey, someCol1) VALUES (id, NEW.someValue);
RETURN NEW;
END; $$ LANGUAGE PLPGSQL;
CREATE TRIGGER MyView_on_insert INSTEAD OF INSERT ON MyView
FOR EACH ROW EXECUTE PROCEDURE MyFuncName();
Run Code Online (Sandbox Code Playgroud)
检查序列的当前值以查看在另一个表中插入的内容是坏的坏习惯.即使您在一次交易中,也不要这样做.
你对RETURNING信息问题感到困惑,因为当我读到你的问题时我也很困惑.在函数内部使用该INTO子句填充本地声明的变量以保存记录值,然后可以在后续语句中使用这些记录值.在函数外部,RETURNING像在最顶部的代码片段中一样使用该子句.
| 归档时间: |
|
| 查看次数: |
2805 次 |
| 最近记录: |