2015-05-15 5 views
1

В системе обмена сообщениями я хочу записать новое сообщение. По техническим причинам В моей системе есть две таблицы. Один ссылается на разговоры, а другой ссылается на сообщения, связанные с этими беседами.Multi INSERT с условием и возвратом SELECT по одному запросу

conversation 

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

(*) convers_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?

Я узнал, что мы можем использовать CTE, связанные с операциями INSERT и SELECT, но я не знаю, как сформулировать свой конкретный запрос.

+0

Должно ли это быть через CTE? Вы открыты для PL/pgsql, правила или триггера? –

+0

Я открыт для любого решения. :-) Но чем проще, тем лучше ... конечно. – Nitseg

ответ

0

Вы можете создать хранимую процедуру PL/pgSQL, которая принимает ваш кортеж в качестве параметров, проверяет ваши таблицы и делает любые вставки обоснованными. В качестве альтернативы, вы могли бы снять что-то более гладкое, используя rules или triggers, или даже CTE, но я недостаточно скользкий, чтобы с готовностью описать, как это сделать.

+0

Я пошел на хранимую процедуру. Это работает. Я отправлю решение по моей конкретной проблеме, так как я не нашел ничего подобного в Интернете. – Nitseg

Смежные вопросы