使用记录 ID 填充 postgresql 中现有记录中的字段以确定记录的位置

使用记录 ID 填充 postgresql 中现有记录中的字段以确定记录的位置

场景

我有一个 postgresql 数据库,其中包含产品变体列表,该列表已自动填充,但没有零件编号。我导出了表格,以便运行一些公式来生成每个产品变体的零件编号。这给了我一个包含相关记录 ID 和相关零件编号的表格。

我想要实现的目标

现在我的表中包含了缺失的信息,那么如何将这些信息重新放回到 postgresql 表中呢?

Postgresql 表 [product_product] 中的示例数据

   id   create_date       weight    default_code     product_templ_id   ...
    1   2016-12-15 18:57       0    000-000000-000                  1   ...
    2   2016-12-16 19:00       0    000-000000-000                  2   ...
    3   2016-12-16 20:42       0    000-000000-000                 31   ...
    4   2016-12-16 20:43       0    000-000000-000                 31   ...
    5   2016-12-16 20:44       0    000-000000-000                 31   ...
    6   2016-12-16 20:45       0                                   31   ...
  ...   ................     ...    ..............                 31   ...
 1603   2016-12-16 21:51       0                                   31   ...
 1604   2016-12-16 21:52       0                                   31   ...

计算零件编号示例列表

  id  default_code  
   6  000-000000-000
 ...  ..............
1604  000-000000-000

我尝试过的方法

好吧,我设置了一个到数据库的 ODBC 连接,链接了 MS Access 2010 中的表。我筛选了product_templ_id字段并按排序id,以匹配我的 Excel 电子表格中的内容。然后,我从default_code列中复制了零件编号并尝试粘贴到起点,但收到一条错误消息,指出我试图粘贴太多信息。我猜想,Access 试图将剪贴板内容粘贴到单个单元格中。这不是我所希望的行为。

哪条路线更好?

这款特定产品有 1440 种变体,每种都有自己的零件编号和 BOM。我真的不想花时间逐行​​生成所有这些。我总是告诉人们,数据就是数据,你可以用数据做任何事情。这只是一个如何做的问题。

- 编辑 -

我可以从 pgAdmin 导出我的表,但是由于某种原因,当我尝试导入时,什么也没有发生。

因此我尝试了以下命令:

COPY product_product (default_code) from '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '/n';

其结果是:

ERROR:  extra data after last expected column
CONTEXT:  COPY product_product, line 2: "203;000-000000-000"

我想,好吧,我提到了一个字段,但我的 csv 有两个字段。这是因为我想确保导入的default_code字段与正确的记录相关联。

接下来我尝试:

COPY product_product FROM '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '\n';

导致:

ERROR:  duplicate key value violates unique constraint "product_product_pkey"
DETAIL:  Key (id)=(2) already exists.

所以现在,我想我最好删除该表并重建它。不幸的是,该表设置了依赖项,因此无法删除。

如果我知道如何在 postgresql 中编辑记录值,我可以编写一个脚本来生成必要的命令以相应地编辑所有 1440 条记录。

答案1

您应该以 CSV 格式导出数据,然后使用 pgAdmin 或 postgres 中的原始 COPY 命令将数据重新导入:

有关如何执行此操作的信息,请参阅此帖子:https://stackoverflow.com/questions/19400173/how-should-i-import-data-from-csv-into-a-postgres-table-using-pgadmin-3

- 编辑 -

下列的这个帖子您可以使用脚本技能来生成以下 SQL 查询:

UPDATE product_product
    SET default_code = CASE id
        WHEN 6 THEN 000-000000-000
        ...
        ...
        WHEN 1603 THEN 000-000000-000
        WHEN 1604 THEN 000-000000-000
        ELSE default_code
        END;

然后使用 pgAdmin 连接到数据库并运行查询。这将解析表中的记录product_product并更新default_code与相对值对应的记录的字段id。如果该id值不在您的列表中,它只会保留该default_code值。

这个帖子使用附加语句结束查询:

        ...
        END
    WHERE id IN(6,...,...,1603,1604);

在这个特定情况下,不需要列出具体id值。此外,IN超过 1440 个值的列表将产生错误。这没关系,因为该ELSE default_code语句充当了一个万能的语句,处理id不在我们case列表中的值。

此解决方案已由OP测试并验证。

相关内容