PostgreSQL中的COPY命令:高效数据导入与导出

news2024/11/14 12:05:06

在PostgreSQL数据库中,数据导入和导出是日常工作中常见的操作。传统的插入(INSERT)方法虽然可以实现数据的导入,但在处理大量数据时效率较低。而COPY命令则提供了一个快速、高效的方式来完成这一任务。COPY命令不仅可以用于将数据从文件导入到表中,还可以将表中的数据导出到文件中,支持多种文件格式,如TEXT、BINARY和CSV。通过使用COPY命令,可以大大提高数据导入和导出的效率,尤其是在处理大量数据时。

一、引言

数据的导入与导出在数据库操作中的重要性:

数据库作为存储和管理数据的核心组件,其数据的导入和导出操作对于维护数据完整性、实现数据迁移、备份和恢复等任务至关重要。无论是对于大型企业还是个人用户,数据的导入和导出都是日常数据库操作中不可或缺的一部分。

传统数据导入方法的局限性:

传统的插入(INSERT)方法虽然可以实现数据的导入,但在处理大量数据时效率较低,且容易出错。
导入大量数据时,需要编写大量的SQL语句,这不仅耗时,而且容易引发错误。
对于数据的格式和一致性检查,传统方法也缺乏足够的自动化和灵活性。

COPY命令的引入及其优势:

COPY命令为PostgreSQL数据库提供了一种快速、高效的数据导入和导出方法。
它支持多种格式,如TEXTBINARYCSV,可以根据实际需求选择合适的格式。
COPY命令可以直接从文件导入数据到表,或将表中的数据导出到文件,大大提高了数据导入和导出的效率。
与传统方法相比,COPY命令具有更高的自动化程度,能够减少人工错误,提高数据导入和导出的准确性。

二、COPY命令的基础

COPY命令概述:

COPY命令是PostgreSQL中用于高效导入和导出数据的命令。它支持从文件导入数据到表,或将表中的数据导出到文件。COPY命令可以处理文本、二进制和CSV格式的数据。支持的格式:TEXTBINARYCSV

  • TEXT格式:适用于纯文本数据,每个字段由分隔符分隔。
  • BINARY格式:适用于二进制数据,例如图像、音频和视频等。
  • CSV格式:以逗号分隔值(Comma Separated Values)的形式存储数据,易于阅读和编辑。

数据的来源和去向:

  • 数据来源可以是本地文件、远程文件或通过网络传输的数据流。
  • 数据去向可以是本地文件、远程文件或通过网络发送的数据流。

通过COPY命令,我们可以将数据库中的数据导出到文件,或者从文件导入数据到数据库表中。

三、COPY命令的用法

将数据从表导出到文件

a. 语法示例:

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) } 
TO { 'filename' | PROGRAM 'command' | STDOUT } 
[ [ WITH ] ( option [, ...] ) ]

b. 参数解释:

  • table_name:要导出数据的表名。
  • column_name:可选,指定要导出的列名。
  • filename:要导出的数据文件的路径。
  • PROGRAM 'command':可选,指定执行命令以发送数据。
  • STDOUT:将数据发送到标准输出流。
  • option:可选,指定COPY命令的选项,如格式、分隔符、编码等。

c. 注意事项:

  • 确保文件存在且可写。
  • 根据需要选择正确的格式和分隔符。
  • 注意文件路径的权限和所有权。

示例:

创建一个表并插入1000000条数据

postgres=# create table test_big(id int,name varchar(50));
CREATE TABLE
postgres=# insert into test_big select n,'test_name' from generate_series(1,1000000) as n;
INSERT 0 1000000
postgres=# select count(*) from test_big;
  count
---------
 1000000
(1 row)

默认不带条件导出

postgres=# \copy test_big to '/home/postgres/test_big.sql'
COPY 1000000

查看导出的数据文件

[postgres@pcp ~]$ cat test_big.sql |more
1       test_name
2       test_name
3       test_name
4       test_name
5       test_name
6       test_name
7       test_name
8       test_name
...

导出文件带字段名

如果需要把列名也打出来,可以加 with csv header;

postgres=# \copy test_big to '/home/postgres/test_big2.sql' with csv header;
COPY 1000000

查看数据文件内容,可以看到第一行是表的字段名

[postgres@pcp ~]$ cat test_big2.sql |more
id,name
1,test_name
2,test_name
3,test_name
4,test_name
5,test_name
6,test_name
7,test_name
8,test_name
...

导出文件自定义数据分割符

如果想把这个逗号改成其他分隔符,可以使用delimiter关键字:

postgres=# \copy test_big to '/home/postgres/test_big3.sql' with csv header delimiter '|';
COPY 1000000

查看数据文件内容:

[postgres@pcp ~]$ cat test_big3.sql |more
id|name
1|test_name
2|test_name
3|test_name
4|test_name
5|test_name
6|test_name
7|test_name
8|test_name
...

导出部分数据

如果只想导出表中的部分数据,可以这样操作:

postgres=# \copy (select * from test_big limit 10) to '/home/postgres/test_big4.sql' with csv header delimiter '|';
COPY 10

查看文件内容:

[postgres@pcp ~]$ cat test_big4.sql
id|name
1|test_name
2|test_name
3|test_name
4|test_name
5|test_name
6|test_name
7|test_name
8|test_name
9|test_name
10|test_name

可以看到只有10条数据,导出的条件可以根据sql自己定义。
更多语法可以通过\h copy查看

postgres=# \h copy
Command:     COPY
Description: copy data between a file and a table
Syntax:
COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
    [ WHERE condition ]

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | PROGRAM 'command' | STDOUT }
    [ [ WITH ] ( option [, ...] ) ]

where option can be one of:

    FORMAT format_name
    FREEZE [ boolean ]
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean | MATCH ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL ( column_name [, ...] )
    FORCE_NULL ( column_name [, ...] )
    ENCODING 'encoding_name'

URL: https://www.postgresql.org/docs/15/sql-copy.html

将数据从文件导入到表

a. 语法示例:

COPY table_name [ ( column_name [, ...] ) ] 
FROM { 'filename' | PROGRAM 'command' | STDIN } 
[ [ WITH ] ( option [, ...] ) ]

b. 参数解释:

  • table_name:要导入数据的表名。
  • column_name:可选,指定要导入的列名。
  • filename:要导入的数据文件的路径。
  • PROGRAM 'command':可选,指定执行命令以获取数据。
  • STDIN:从标准输入流读取数据。
  • option:可选,指定COPY命令的选项,如格式、分隔符、编码等。

c. 注意事项:

  • 确保数据文件与数据库中的表结构匹配。
  • 根据需要选择正确的格式和分隔符。
  • 确保数据文件存在且可读。

示例

从刚才导出的文件中导入数据。先创建一个空表

postgres=# create table test_copy(id int,name varchar(50));
CREATE TABLE

导入数据,按照刚才导出的顺序,先导入第一个文件test_big.sql,不带列名的

postgres=# \copy test_copy from '/home/postgres/test_big.sql';
COPY 1000000
postgres=# select count(*) from test_copy;
  count
---------
 1000000
(1 row)

导入第二个文件test_big2.sql,文件里面数据带列名。

postgres=# \copy test_copy from '/home/postgres/test_big2.sql' with csv header;
COPY 1000000
postgres=# select count(*) from test_copy;
  count
---------
 2000000
(1 row)

导入第三个文件test_big3.sql,文件数据带列名且分割符自定义类型。

postgres=# \copy test_copy from '/home/postgres/test_big3.sql' with csv header delimiter '|';
COPY 1000000
postgres=# select count(*) from test_copy;
  count
---------
 3000000
(1 row)

全部成功导入,总结一下

怎样导出的,就可以怎样导入

注意点

使用COPY命令进行数据导入或导出时,如果操作被中断(例如通过按Ctrl+C),其行为会依赖于COPY命令的具体执行方式以及你的操作环境。

使用psql命令行工具:

如果你使用psql命令行工具并运行\COPY命令,那么当操作被中断时,通常psql会停止并可能显示错误消息。但是,已经成功传输到数据库的数据不会被回滚,而已经读取但尚未传输到数据库的数据可能会留在psql的缓冲区中
如果你使用的是psql\COPY命令,并且数据是通过管道(pipe)从另一个程序读取的,那么当操作被中断时,这个管道会被关闭,但已经读取的数据仍然可能留在psql的缓冲区中。

使用COPY SQL命令:

如果你在SQL脚本或命令行中使用COPY命令,并且该命令被中断,那么已经成功写入数据库的数据不会被回滚,但读取的数据可能仍然在COPY命令的缓冲区中。
如果COPY命令使用了事务,并且事务被回滚,那么已经写入数据库的数据会被回滚,但读取的数据可能仍然留在COPY命令的缓冲区中。

COPY命令在PostgreSQL中非常快的原因主要归因于以下几点:

直接文件访问

COPY命令直接访问文件,绕过了数据库内部的一些中间层,从而减少了数据在数据库和文件系统之间的额外传输。这使得COPY命令能够更快地传输数据。

避免事务开销

传统的SQL插入操作可能涉及多个事务和回滚,这会增加额外的开销。而COPY命令通常在一个事务中执行,从而减少了事务开销,提高了效率。

批量操作

COPY命令允许你一次性插入或导出大量数据,而不是一次插入或导出一条记录。这种批量操作减少了数据库与客户端之间的通信次数,从而提高了效率。

跳过索引和触发器

在执行COPY命令时,PostgreSQL可以跳过索引的更新和触发器的执行,这进一步提高了性能。

减少锁竞争

由于COPY命令通常在一个事务中执行,所以它可以减少锁竞争,从而避免阻塞其他操作。

利用磁盘缓存

PostgreSQL使用磁盘缓存来缓存数据,这有助于减少磁盘I/O操作,从而提高性能。

由于上述原因,COPY命令在PostgreSQL中通常比传统的插入或导出方法更快。

COPY命令在PostgreSQL数据库操作中扮演着重要角色,它提供了一种高效、自动化的数据导入和导出方法。通过正确的使用COPY命令,我们可以大大提高数据导入和导出的效率,减少人工错误,并确保数据的完整性和安全性。在实际应用中,我们需要根据数据量、格式和数据库配置等因素,选择合适的导入方法,并注意监控数据库的性能和资源使用情况,以确保系统的稳定和数据的安全。

随着数据库技术的不断发展,我们可以期待更多高效、自动化的数据操作方法的出现,以更好地满足实际应用的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的常用命令大全

目录 一、Redis简介 1.键值型 2.NoSQL 2.1关联和非关联 2.2查询方式 2.3事务 2.4总结 二、Redis常见命令 2.1 通用命令 2.2 String 命令 2.3 Hash类型 2.4 List类 2.5 Set集合 2.6 SortedSet类型 一、Redis简介 Redis是一种键值型的NoSql数据库,这里…

浅谈PostGIS中的抽稀技术——实现高效空间数据可视化的关键

目录 前言 一、原始数据介绍 1、原始完整数据 2、Qgis中展示原始数据 二、减少数据精度 1、查询函数简介 2、减少精度实战 三、ST_Simplify抽稀实现 1、ST_Simplify函数介绍 2、ST_Simplify抽稀结果 四、ST_SimplifyPreserveTopology抽稀 1、函数介绍 2、抽稀结果 …

网约车管理:规范发展,保障安全与便捷

在数字化时代,网约车已成为城市出行的重要组成部分,为公众提供了前所未有的便捷性。然而,随着网约车行业的迅猛发展,一系列管理问题也随之浮现,如司机资质审核不严、车辆安全标准不一、乘客权益保护不足等。这些问题不…

vue3入门和实战-vue3项目布局

文章目录 前言一、项目目标二、页面布局1.首页布局分析2. 首页布局实现App.vueLayoutIndex.vueLayoutLeft.vueHome.vueHome/components/Header.vueHome/components/Footer.vue3.首页路由4.首页效果显示总结前言 上一节,部署了vue3官方案例,我们需要结合自身项目页面的布局改…

深度学习经典模型之VGGNet

1 VGGNet 1.1 模型介绍 ​ VGGNet是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以7.32%的错误率赢得了2014年ILSVRC分类任务的亚军(冠军由GoogLeNet以6.65%的错误率夺得)和…

【364】基于springboot的高校科研信息管理系统

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

【Windows】CMD命令学习——系统命令

CMD(命令提示符)是Windows操作系统中的一个命令行解释器,允许用户通过输入命令来执行各种系统操作。 系统命令 systeminfo - 显示计算机的详细配置信息。 tasklist - 显示当前正在运行的进程列表。 taskkill - 终止正在运行的进程。例如&am…

深入探索Waymo自动驾驶技术发展:从DARPA挑战赛到第五代系统的突破

引言 自动驾驶技术正引领着未来出行方式的革命,而Waymo作为全球自动驾驶领域的先锋,始终走在技术发展的最前沿。本文基于Waymo联席CEO德米特里多尔戈夫(Dmitri Dolgov)在No Priors节目中的访谈,全面介绍Waymo的技术发展…

泷羽sec学习打卡-Windows基础virus

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows virus的那些事儿 一、Windows-Virus资源耗尽之无限弹窗cmd-virus测试锁机virus测试无限重启…

python机器人Agent编程——实现一个本地大模型和爬虫结合的手机号归属地天气查询Agent

目录 一、前言二、准备工作三、Agent结构四、python模块实现4.1 实现手机号归属地查询工具4.2实现天气查询工具4.3定义创建Agent主体4.4创建聊天界面 五、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源ps3.wifi小车控制相关…

如何线程安全的使用HashMap

前言 Map一直是面试中经常被问到的问题。博主在找工作的过程中,就被问到了这样一个问题: Map是线程安全的吗?我不考虑使用线程安全的Map(eg:ConcurrentHashMap) 。如何在多线程/高并发下安全使用 HashMap? 当时博主…

基于MATLAB+opencv人脸疲劳检测

我们可以通过多种方式从现实世界中获取数字图像,比如:数码相机、扫描仪、计算机扫描和磁共振成像等等。在这些情况中,虽然我们肉眼看到的是图像,但是当需要将图像在数字设备中变换传输时,图像的每个像素则对应一个数值…

区块链技术在知识产权保护中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 引言 区块链技术概述 …

交友系统app源码优势,怎么去开发一个交友系统,它适合的场景

https://gitee.com/fantnerd/hunlian.githttps://gitee.com/fantnerd/hunlian.git 语音交友app源码技术优势: 1、语音交友app源码服务端开发语言采用PHP。 2、服务端开发框架主要TP6 3、开发环境:Nginx或者Apache 数据库mysql5.6。 交友程序源码的开发…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量(我的是在~/.bash.profile) export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

qt QClipboard详解

1、概述 QClipboard是Qt框架中的一个类,它提供了对窗口系统剪贴板的访问能力。剪贴板是一个临时存储区域,通常用于在应用程序之间传递文本、图像和其他数据。QClipboard通过统一的接口来操作剪贴板内容,使得开发者能够方便地实现剪切、复制和…

第3篇 滑动开关控制LED__ARM汇编语言工程<一>

Q:如何设计实现滑动开关控制LED的ARM汇编程序呢?与Nios II汇编语言有何不同呢? A:基本原理:该应用程序用到DE1-SoC开发板上的10个红色LED、10个滑动开关SW和4个按钮开关。DE1-SoC_Computer system的qsys系统中IP的硬件…

Jenkins安装自定义插件

看到这个博客,你可能遇到跟我一样的问题:直接使用jenkins插件时,在线安装的插件可能版本不符合要求。 怎么办呢 找到相关插件的版本 https://plugins.jenkins.io/build-name-setter/ 下载相应版本 安装

uniapp—android原生插件开发(4uniapp引用aar插件)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 一、将android程序打包成aar插件包 直接使…

FFMPEG录屏(22)--- Linux 下基于X11枚举所有显示屏,并获取大小和截图等信息

众人拾柴火焰高,github给个star行不行? open-traa/traa traa is a versatile project aimed at recording anything, anywhere. The primary focus is to provide robust solutions for various recording scenarios, making it a highly adaptable tool…