2016-10-28 18 views
0

我有一個表product,列product_image_path。這些數據部分需要移動到相關表image,該表有一個單獨的列image_path和代理鍵id。這些表通過外鍵product.image_id相關。有沒有辦法將product_image_path的所有值插入到image表中,並立即更新product.image_id以引用剛剛創建的行?PostgreSQL:將列提取到單獨的表中並使用相關密鑰更新其他列

這必須在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

添加一些樣本表數據,在版本之前和之後。 (以及格式化文本。) – jarlh

+0

@jarlh我現在已經添加了一些示例數據。 – amoe

回答

1

如果新的圖片ID可以是相同的產品ID,這是很簡單的:

創建新表:

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列的順序:

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

添加新image_id列,並填充它:

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

擺脫old_column的:

alter table product drop product_image_path; 
相關問題