postgresql – Postgres插入视图规则与返回条款

postgresql – Postgres插入视图规则与返回条款,第1张

概述我试图允许带有返回子句的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, someC 我试图允许带有返回子句的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 *;

请注意,时间的默认值为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,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值?谢谢!

解决方法 你最好在这里使用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();

检查序列的当前值以查看在另一个表中插入的内容是坏的坏习惯.即使您在一次交易中,也不要这样做.

您对RETURNING信息的问题感到困惑,因为当我阅读您的问题时,我也很困惑.在函数内部使用INTO子句填充本地声明的变量以保存记录值,然后可以在后续语句中使用这些记录值.在函数外部,使用RETURNING子句,就像在最顶部的代码片段中一样.

总结

以上是内存溢出为你收集整理的postgresql – Postgres插入视图规则与返回条款全部内容,希望文章能够帮你解决postgresql – Postgres插入视图规则与返回条款所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1161433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存