在消息系统中,我想录制一条新消息。 由于技术原因,我的系统中有两个表。一个引用对话,另一个引用链接到这些对话的消息。
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,但我不知道如何表达我的具体要求。
最佳答案
您可以创建一个 PL/pgSQL接受您的元组作为参数的存储过程,检查您的表并执行任何必要的插入操作。或者,您可以使用 rules 来完成一些更巧妙的事情。或 triggers ,甚至 CTE,但我不够圆滑,无法轻松描述如何实现。
关于sql - 带有条件的多个 INSERT 和 SELECT 在一个请求中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264336/