Postgres-将列移动到另一个表或更新另一个列

时间:2019-06-16 20:49:53

标签: sql postgresql insert-update upsert sql-merge

我有两个表:

  

产品 >>了解基本商品信息。标题,创建时间等...

     

PRODUCT_IMAGE >>用于商品图片。 1个产品可能有多张图片

PRODUCT_IMAGE中的

“ product_id”是PRODUCT中“ id”的外键

产品

id  |   time    |   title   |   image_url
562 |   2019    |   iPhone  |   http://repo.coi/img/3520.png
....

PRODUCT_IMAGE

id  | product_id    |   url             |   is_primary
10  | 4523          |   /ipo/2388/png   | True
....

我需要将image_url列从PRODUCT移到PRODUCT_IMAGE

  

如果url中已经存在PRODUCT_IMAGE,然后将is_primary更新为   True

     

如果不先插入新行(product_idimage_url,   is_primary=False)到PRODUCT_IMAGE

2 个答案:

答案 0 :(得分:1)

如果您的数据库版本为9.5+,则可以使用insert ... on conflict update语法。因此,请考虑使用

insert into product_image(product_id, url, is_primary) 
select id, image_url, False from product
   on conflict(url) do update 
  set is_primary = True;

其中product_image.url应该是unique,如 Demo

答案 1 :(得分:0)

这需要一个UPDATE

update PRODUCT_IMAGE pi
set is_primary = True
from PRODUCT p
where p.id = pi.product_id and p.image_url = pi.url;

然后是INSERT

insert into PRODUCT_IMAGE (product_id, url, is_primary)
select p.id, p.image_url, False
from PRODUCT p
where not exists (
  select 1 from PRODUCT_IMAGE
  where product_id = p.id and url = p.image_url
);

请参见demo