COPY
是一个 DML 命令,用于将数据批量导入/导出到/从文件,或者(从 PostgreSQL 9.3 开始)到/从程序。
COPY
始终存在于 PostgreSQL 中。
限制
COPY
仅限于 PostgreSQL 运行所在的宿主操作系统上,其操作系统用户允许的操作。
从 PostgreSQL 11 开始,COPY
对超级用户和以下 预定义角色的成员可用。
pg_read_server_files
pg_write_server_files
pg_execute_server_program
在 PostgreSQL 10 及更早版本中,COPY
的使用仅限于超级用户。
进度报告
从 PostgreSQL 14 开始,进度报告视图 pg_stat_progress_copy
提供了关于 COPY
操作进度的信息。
psql
psql
提供了斜杠命令 \copy
,该命令支持 COPY 操作在客户端系统和服务器之间进行(克服了 SQL COPY
命令仅限于本地服务器的限制)。
变更历史
进行中
- PostgreSQL 19
- 支持在
COPY FROM
中使用多行头(提交 bc2f348e)
- 支持在
- PostgreSQL 18
- PostgreSQL 17
- PostgreSQL 16
- PostgreSQL 15
- PostgreSQL 14
- 通过改进缓冲提高了性能(提交 0a0727cc)
- 通过
pg_stat_progress_copy
进行进度跟踪(提交 8a4f618e)
- PostgreSQL 12
- PostgreSQL 11
- PostgreSQL 10
COPY view FROM
现在可以插入到定义了INSTEAD OF INSERT
触发器的视图中(提交 279c439c)
- PostgreSQL 9.6
COPY
现在可以复制INSERT
/UPDATE
/DELETE ... RETURNING
查询的输出(提交 92e38182)
- PostgreSQL 9.4
- PostgreSQL 9.3
- PostgreSQL 9.1
- 添加了
ENCODING
选项(提交 3cba8240)
- 添加了
- PostgreSQL 8.2
- 添加了
COPY (SELECT ...) TO ...
语法(提交 85188ab8)
- 添加了
- PostgreSQL 8.0
- 添加了
CSV
选项(提交 862b20b3)
- 添加了
- PostgreSQL 7.4
- PostgreSQL 7.3
- PostgreSQL 7.2
- PostgreSQL 7.1
- 二进制复制模式的新文件格式(提交 676cf18c)
- PostgreSQL 7.0
- PostgreSQL 6.3
- 失败时报告行号(提交 deea69b9)
示例
COPY
的基本用法示例
postgres=# COPY foo FROM STDIN; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself, or an EOF signal. >> 1 >> 2 >> 3 >> 4 >> \. COPY 4
参考资料
- PostgreSQL 文档: COPY
有用链接
- PostgreSQL Copy - 2023 年 6 月,Shivayan Mukherjee / SQL Server Central 的博客文章