迁移PSQL中的关联列

时间:2017-01-10 00:05:08

标签: sql postgresql database-migration sql-scripts

我有一个表格,我们遇到了一个问题,因为我们做了一个错误的假设,即表A与表B相关但它应该是表C.这只是一个问题,因为我们现在正在增加一个功能,但是我我不确定如何正确迁移它。

我可以描述的最佳方式是说您有accountvehiclevehicleHistorycarLot

目前vehicleHistoryvehicle绑定,但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)编写脚本?

2 个答案:

答案 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;

我的建议是:

  1. 运行上述查询并添加其他列。
  2. 检查以确定这是您真正想要的。检查重复的行,不匹配以及您能想到的任何其他内容。
  3. 将CarLotId添加到VehicleHistory表。看看是否有任何损坏。
  4. 填充新列(见下文)。
  5. 填充新列:

    update VehicleHistory
        set CarLotId = t.CarLotId
        from <temporary table based on above query> t
        where t.id = VehicleHistory.id;
    

    根据您的描述,没有理由删除原始列。

答案 1 :(得分:0)

(未经检查,因为我没有DDL)

        -- 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;