场景
我有一个 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测试并验证。