postgresql 如何根据上一个查询插入新记录

blmhpbnm  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(160)

我需要更新表中的一些列(stats)&如果失败或成功(无论结果如何),那么在表中创建一个新记录(notifications),不使用分号(;)在第一次和第二次查询之间

  • 第一次查询:*
UPDATE stats SET delivered = delivered + 1 WHERE id = 1
  • 第二次查询:*
INSERT INTO notifications (text) VALUES ('table stats updated')

(The上面的示例不起作用。)
请注意

  • 我不能使用过程、函数或触发器,只能使用简单的查询。
  • 我不能用分号(;)在两个查询之间。
  • 需要首先执行更新查询。

我已经尝试了一些没有结果的查询,例如

UPDATE stats SET delivered = delivered + 1 WHERE id = 
     (INSERT INTO notifications (text) VALUES ('table stats  updated') RETURNING id)

6pp0gazn

6pp0gazn1#

如果希望所有命令都在一个事务语句中,则可以使用多个WITH在一个事务中执行多个命令:

WITH query1 AS (
UPDATE stats SET delivered = delivered + 1 WHERE id = 1 RETURNING delivered
),
query2 AS (
    INSERT INTO notifications (text) 
    SELECT  delivered FROM query1 RETURNING id 
)
SELECT * FROM query1 , query2 ;

规则示例:

CREATE RULE rul_delivered_insertnotification AS ON UPDATE 
     TO delivered WHERE true
     DO (
     INSERT INTO notifications (notification) VALUES (NEW.delivered) ;
     ) ;
     CREATE RULE rul_notification_deliverednotification AS ON INSERT 
     TO notifications WHERE true
     DO (
     SELECT NEW.notification ;
     );

下面的发送更新将转到规则,插入到通知中,然后通知将检索插入字段通知的选择。
第二个图像上有规则返回和无规则的表:
第一节第一节第一节第一节第一次

相关问题