我有一个表格,我们遇到了一个问题,因为我们做了一个错误的假设,即表A与表B相关但它应该是表C.这只是一个问题,因为我们现在正在增加一个功能,但是我我不确定如何正确迁移它。
我可以描述的最佳方式是说您有account
,vehicle
,vehicleHistory
,carLot
。
目前vehicleHistory
与vehicle
绑定,但vehicleHistory
carLot
应与id |
-----
001 |
002 |
003 |
绑定。示例表。这是今天的表格:
帐户
id | accountId
----------------
101 | 001
102 | 002
103 | 003
车辆
id | vehicleId
----------------
201 | 101
202 | 102
203 | 103
vehicleHistory
id | accountId
----------------
301 | 001
302 | 002
303 | 003
卡洛特
id |
-----
001 |
002 |
003 |
但它应该是这样的:
帐户
id | accountId
----------------
101 | 001
102 | 002
103 | 003
车辆
id | carLotId
---------------
201 | 301
202 | 302
203 | 303
vehicleHistory
id | accountId
----------------
301 | 001
302 | 002
303 | 003
卡洛特
{{1}}
这是我甚至应该在PSQL中尝试的东西,还是应该用应用程序的语言(Node或Scala)编写脚本?
答案 0 :(得分:1)
我会在数据库中非常小心地处理这个问题,但我认为可以做到。基本上,您希望将VehicleHistory
替换为:
select vh.id, cl.carlotid
from VehicleHistory vh left join
Vehicle v
on vh.vehicleid = v.id left join
CarLot cl
on v.accountid = cl.accountid;
我的建议是:
VehicleHistory
表。看看是否有任何损坏。填充新列:
update VehicleHistory
set CarLotId = t.CarLotId
from <temporary table based on above query> t
where t.id = VehicleHistory.id;
根据您的描述,没有理由删除原始列。
答案 1 :(得分:0)
-- to be safe: make a copy
CREATE TABLE vehicle_history_saved AS select * from vehicle_history;
-- (maybe drop FK constraints here)
-- do the update
UPDATE vehicle_history dst
SET vehicle_id = cl.carlot_id
FROM carlot cl
JOIN vehicle ve ON ve.account_id = cl.account_id
WHERE dst.vehicle_id = ve.id
;
ALTER TABLE vehicle_history RENAME vehicle_id TO carlot_id;
-- (maybe recreate FK constraints here)
-- (maybe drop copy )
-- DROP TABLE vehicle_history_saved;