PostgreSQL:将列提取到单独的表中,并使用相关键

时间:2016-10-28 08:07:43

标签: sql postgresql

我有一个表product,其中包含product_image_path列。需要将这些数据部分移动到相关表格image,该表格具有单独的列image_path和代理键id。这些表通过外键product.image_id相关联。有没有办法将product_image_path的所有值插入image表并立即更新product.image_id以引用刚刚创建的行?

这必须在SQL或PL / pgSQL中完成,因为它是一系列数据库迁移的一部分,不允许任意脚本。

product:
 id | product_image_path     
----+-------------------
  1 | foo.jpg
  2 | bar.jpg
  3 | foo.jpg

应该成为:

product:
id | image_id
---+---------
1  | 1
2  | 2
3  | 3

image:
id | image_path
---+-----------
1  | foo.jpg
2  | bar.jpg
3  | foo.jpg

1 个答案:

答案 0 :(得分:1)

如果新图片ID可以与产品ID相同,则非常简单:

创建新表:

Categories.update({
        '_id': {
            $in : array_of_IDs
        } 
    },
    {
        $push :{
            'courses':{ _id: ret._id , name: ret.title }
        }
    },{ multi: true }, function(err, respp){
        //....
    }
);

从产品表中复制数据:

create table image (id serial primary key, image_path text);

调整insert into image (id, image_path) select id, product_image_path from product; 列的顺序:

image.id

添加新的image_id列并填充它:

select setval(pg_get_serial_sequence('image', 'id'), (select max(id) from image));

摆脱old_column:

alter table product add image_id integer;
update product set image_id = id;