使用 CSV 数据优化 Postgres 更新
使用 CSV 文件中的数据高效更新 Postgres 表对于数据管理至关重要。 假设您有一个表(id、banana、apple)和一个包含更新的 banana
值的 CSV 文件。 挑战是仅更新 banana
列而不修改 apple
列。
利用 COPY
和 UPDATE
进行高效更新
最佳方法是使用 COPY
将 CSV 导入到临时表中,然后根据 UPDATE
列执行 id
。流程如下:
<code class="language-sql">CREATE TEMP TABLE tmp_x (id int, apple text, banana text); -- Or see alternative below COPY tmp_x FROM '/absolute/path/to/file' (FORMAT csv); UPDATE tbl SET banana = tmp_x.banana FROM tmp_x WHERE tbl.id = tmp_x.id; DROP TABLE tmp_x; -- Alternatively, it's automatically dropped at the end of the session</code>
当临时表结构镜像目标表时,要采用更简化的方法:
<code class="language-sql">CREATE TEMP TABLE tmp_x AS SELECT * FROM tbl LIMIT 0;</code>
这将创建一个与 tbl
具有相同架构的空临时表,并省略约束。
安全和性能注意事项
在 Postgres 11 之前,COPY
需要超级用户权限。 但是,Postgres 11 及更高版本提供了预定义角色(例如 pg_read_server_files
和 pg_write_server_files
)以提高安全性。
psql
元命令 copy
提供了另一种解决方案,在本地执行 COPY
命令,从而绕过超级用户权限要求。
对于大型 CSV 文件,优化性能至关重要。 考虑暂时增加 temp_buffers
参数。 在临时表的id
列上创建索引并运行ANALYZE
可以进一步提升查询速度。
以上是如何从 CSV 文件有效更新 Postgres 表中的行?的详细内容。更多信息请关注PHP中文网其他相关文章!