Моя база данных выглядит следующим образом: https://dbfiddle4ec5e3d1e0e0e0e6e0e08e08e08e0e0e0e0e0e0e0e0e0e6e08e0e0e0e0e0e6
So
- У пользователя может быть несколько книг
- Основные отношения "один ко многим"
Предположим, что если пользователь обновит уже существующую книгу и добавит новые книги, как я могу сделать для этого запрос?
Я провел небольшое исследование и пришел к выводу, что на помощь мне придут либо cte, либо функция.
Данные моего тела запроса (JSON) FOR PATCH QUERY будут выглядеть следующим образом
{
// user data
user_id: 1,
name : 'Ryan',
books : [
{
book_id : 1,
stock : 500
},
{
book_id : 2,
stock : 500
},
{
// this book should be added to the users_books table
name: 'My new book 1',
stock : 500
}
]
}
The postgresql update queries for the above data should look like ->
UPDATE users_books(stock) VALUES(500) WHERE user_id = 1 AND book_id 1;
UPDATE users_books(stock) VALUES(500) WHERE user_id = 1 AND book_id 2;
INSERT INTO users_books(user_id,book_id,stock) VALUES(1,3,500);
Итак, глядя на структуру выше, мне нужно, чтобы таблица books_users обновилась соответствующим образом.
Мое текущее понимание - передать объект книг как jsonb в функцию postgresql. Затем прокрутите его, обновляя / добавляя книги соответственно. Я не уверен, как мне узнать, есть ли у пользователя книга или нет.
Как бы вы, ребята, преобразовали это тело запроса в вышеупомянутый сложный запрос на обновление? И будет ли выполнение этого в функции транзакционным?