我有一张桌子books
:
列名 | 类型 |
---|---|
ID | 整数(主键) |
姓名 | 文本 |
nb_pages | 整数 |
还有一张桌子book_modifications
:
列名 | 类型 |
---|---|
ID | 整数(主键) |
旧数据 | jsonb |
新数据 | jsonb |
book_id | 整数(FK) |
现在让我们想象一下我的表中有一行books
这样的内容:
id: 15,
name: "name-1",
nb_pages: 120
并在我的表中插入一行,book_modifications
如下所示:
id: 7,
old_data: {name: "name-1", nb_pages: 120},
new_data: {name: "new-name-1"},
book_id: 15
我的问题是:
如何在 SQL 或 PostgreSQL 中books
使用表new_data
的列来更新表?book_modifications
目前我已经找到了这种方法:
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;
$$
在这种情况下,上面的 SQL 查询将更新nb_pages
为,null
因为它不存在于中new_data
(这将产生错误),而我想留nb_pages
在 120 并且只更新存在于中的字段new_data
。
对于 INSERT,我已经看到它json_object
存在,但是对于 UPDATE 我找不到它。