具有条件和SELECT的多INSERT在单个请求中返回

时间:2015-05-15 16:23:22

标签: sql postgresql

在邮件系统中,我想录制新邮件。 由于技术原因我的系统中有两个表。一个引用会话,另一个引用链接到这些会话的消息。

conversation

conversation_id
---------------
             3
             4
             8
            12

(*)conversation_id是一个序列号。

message

 message_id | conversation_id |      timestamp      | sender_id | receiver_id |            message           
------------+-----------------+---------------------+-----------+-------------+-------------------------------
         12 |               3 | 2015-05-13 15:46:36 |         1 |           2 | Hello Bob! How are you doing?
         13 |               3 | 2015-05-13 15:55:10 |         2 |           1 | I'm fine, and you?

当系统记录新消息时,如果尚未完成,我希望它自动创建相应的对话。 我希望该声明能够返回完整的对话(意味着所有与刚刚添加的消息相关联的消息)。

因此,如果尚未创建对话,系统将插入对话,然后插入消息并最终返回整个对话。

所以我只想将这个元组提供给postGreSQL (timestamp,sender_id,receiver_id,message),让它处理对话部分(创建或选择)。

我想恢复完整的对话,就像我做的那样:

SELECT * FROM message WHERE conversation_id="xxxx"

是否可以在一个SQL语句中执行所有这些操作?

我发现我们可以使用与INSERT和SELECT操作相关联的CTE,但我不知道如何表达我的具体要求。

1 个答案:

答案 0 :(得分:0)

您可以创建一个PL/pgSQL存储过程,它接受您的元组作为参数,检查您的表并执行任何插入保证。或者,您可以使用rulestriggers甚至是CTE来获得更多光滑的内容,但我并不是很容易描述如何。