Eu tenho uma tabela books
:
Nome da coluna | Tipo |
---|---|
eu ia | int (PK) |
nome | texto |
nb_pages | int |
E uma mesa book_modifications
:
Nome da coluna | Tipo |
---|---|
eu ia | int (PK) |
dados_antigos | jsonb |
novos_dados | jsonb |
id_do_livro | int (FK) |
Agora vamos imaginar que tenho uma linha na minha books
tabela como esta:
id: 15,
name: "name-1",
nb_pages: 120
E uma linha para inserir na minha book_modifications
tabela assim:
id: 7,
old_data: {name: "name-1", nb_pages: 120},
new_data: {name: "new-name-1"},
book_id: 15
Minha pergunta é:
Como posso atualizar minha books
tabela com a new_data
coluna da minha book_modifications
tabela no SQL ou PostgreSQL?
Atualmente encontrei esta maneira:
create or replace function on_book_modifications_insert ()
returns trigger
language plpgsql
as $$
begin
-- Here (new_data only contains the 'name' field)
UPDATE books
SET name = new.new_data -> 'name', nb_pages = new.new_data -> 'nb_pages'
WHERE id = new.book_id;
return new;
end;
$$
Neste caso, a consulta SQL acima será atualizada nb_pages
para null
porque não está presente em new_data
(o que gerará um erro), enquanto eu gostaria de deixar nb_pages
em 120 e atualizar apenas os campos presentes em new_data
.
Para INSERT, vi que json_object
existe, mas não consigo encontrá-lo para UPDATE.