Postgresql

PostgreSQL 更新表然後插入另一個表

  • September 21, 2020

我有一張User桌子和一張Log桌子。我需要更新表格上的一個欄位並在記錄更新User的表格上插入一個新條目。Log我已經寫了更新聲明:

 UPDATE users SET free_shipping_until = spu.created_at::date + interval '1 year'
 FROM shipping_priority_users AS spu
 WHERE spu.role_id = #{role.id} and users.id = spu.user_id and spu.created_at is not null;

Log對於每個更新,我還需要在具有以下列的表上添加(可能在事務中)插入語句

user_id: string,
created_at: timestamp
data: jsonb
  • 數據列包含一個 jsonb 值,其中包括free_shipping_until來自更新的值。
data: {"free_shipping_until": [null, "2021-07-30"]}
  • user_id應該匹配更新記錄的值
  • created_at列是目前時間,我正在使用 RoR 並且可以使用預期格式插入值。

我正在使用 PostgreSQL 12.3

您可以使用數據修改 CTE在單個語句中執行此操作:

with changed_user as (
 UPDATE users 
   SET free_shipping_until = spu.created_at::date + interval '1 year'
 FROM shipping_priority_users AS spu
 WHERE spu.role_id = #{role.id} 
   and users.id = spu.user_id 
   and spu.created_at is not null
 returning *
) 
insert into log (user_id, created_at, data)
select id, 
      current_timestamp, 
      jsonb_build_object('free_shipping_until', array[null, free_shipping_until::text])
from changed_user;

來自更改使用者

引用自:https://dba.stackexchange.com/questions/275804