COPY TO命令是否覆盖输出文件?重复复制时旧数据会被删除吗?
关于PostgreSQL COPY TO命令的覆盖与追加问题
核心问题解答
COPY TO命令默认会直接覆盖目标文件,执行你提供的语句:
目标文件COPY (SELECT * FROM Car) TO 'D:\study\s.csv' WITH DELIMITER ',' CSV HEADER;D:\study\s.csv中的原有旧数据会被完全删除,然后写入本次查询的新数据。
实现数据追加到同一文件的方法
因为COPY TO本身没有内置的追加模式,需要借助操作系统的重定向功能来实现:
1. 命令行环境下的追加方式(以Windows为例)
使用psql客户端执行查询并将输出重定向追加到文件:
- 第一次执行(写入表头+数据):
psql -d 你的数据库名 -c "COPY (SELECT * FROM Car) TO STDOUT WITH DELIMITER ',' CSV HEADER" >> D:\study\s.csv - 后续追加(只写入数据,避免重复表头):
psql -d 你的数据库名 -c "COPY (SELECT * FROM Car) TO STDOUT WITH DELIMITER ',' CSV" >> D:\study\s.csv
2. 脚本化处理(可选)
如果需要自动化处理,可以编写批处理/Shell脚本,逻辑如下:
- 先判断目标文件是否存在;
- 若不存在,执行带
HEADER的COPY语句; - 若已存在,执行不带
HEADER的COPY语句并追加。
内容的提问来源于stack exchange,提问作者Александр Савчиц
相关产品推荐
相关产品推荐

