PostgreSQL 12: COPY FROM 命令支持 WHERE 过滤条件

数据导入和导出是比较常用的功能,通过 PostgreSQL 的 COPY 命令可以很方便的导出表的全部数据或部分数据,例如,导出表 log_sample 的部分数据,如下:

1
# COPY (SELECT * FROM log_sample WHERE id < 1001) TO '/home/pg12/log_sample.txt';

但导入的时候没有选项可以支持,PostgreSQL 12 版本的 COPY FROM 命令新增 WHERE 选项,可以过滤需要导入的数据。

手册说明

Add a WHERE clause to COPY FROM which controls which rows are output (Surafel Temesgen)

COPY 命令语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 ]
QUOTE 'quote_character'
ESCAPE 'escape_character'
FORCE_QUOTE { ( column_name [, ...] ) | * }
FORCE_NOT_NULL ( column_name [, ...] )
FORCE_NULL ( column_name [, ...] )
ENCODING 'encoding_name'

COPY 命令语法没有太大变化,仅增加了 WHERE condition 选项。

COPY.. WHERE 演示

创建测试表,如下:

1
2
3
CREATE TABLE log_sample(id int8 ,name text,creat_time timestamp(0) without time zone default clock_timestamp());    
INSERT INTO log_sample(id,name) select n,n||'_test' from generate_series(1,100000) n;
ALTER TABLE log_sample ADD PRIMARY KEY (id);

导出 log_sample 表部分数据,如下:

1
2
mydb=#  COPY (SELECT * FROM log_sample WHERE id < 1001) TO '/home/pg12/log_sample.txt';
COPY 1000

创建测试表 log_sample2,并通过 COPY..WHERE 命令从 “/home/pg12/log_sample.txt” 文件中导入一条数据,如下:

1
2
3
4
5
6
7
8
9
10
11
mydb=# CREATE TABLE log_sample2( LIKE log_sample);
CREATE TABLE

mydb=# COPY log_sample2 FROM '/home/pg12/log_sample.txt' WHERE id=1;
COPY 1

mydb=# SELECT *FROM log_sample2;
id | name | creat_time
----+--------+---------------------
1 | 1_test | 2019-07-22 15:33:23
(1 row)

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%