金仓数据库KingbaseES COPY命令介绍之COPY FROM
关键字:
KingbaseES、COPY、COPY FROM;人大金仓;KingbaseES
COPY语句介绍
在KingbaseES数据库中,支持移动表和文件系统数据的COPY命令。COPY命令分为COPY TO和COPY FROM命令。COPY TO用于移动一个表中的数据到文件中。COPY FROM支持从文件中复制数据到表中。
COPY 命令支持设置输入输出文件选项,支持选项如下:
可选选项 | 说明 |
FORMAT | 输出文件格式 |
PROGRAM | 要执行的命令,命令输入输出将被捕获 |
FREEZE | 复制完成行冻结的数据 |
DELIMITER | 列分隔符 |
TERMINATOR | 换行字符 |
NULL | 空字符串 |
HEADER | 是否输出列名 |
FORCE_NOT_NULL | 不匹配空字符串 |
FORCE_NULL | 指定列值置空 |
ENCODING | 文件编码格式 |
COPY FROM的语法
COPY FROM命令支持获取文件系统的信息复制到表中。需要注意的是,COPY FROM命令可以被用于普通表、外部表、分区表和具有instead of insert触发器的视图。
COPY FROM语法如下:
COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | PROGRAM 'command' | STDIN } [ [ WITH ] ( option [, ...] ) ] [ WHERE condition ] |
COPY FROM的使用
示例1:对文件进行复制
--将表中数据复制到文件中 Create table timezone_table as select * from pg_timezone_names; --copy to的目标文件只能以绝对路径的方式指定 copy timezone_table to 'timezone.csv' with (format 'csv',header 'true'); copy timezone_table to '/opt/timezone.csv' with (format 'csv',header 'true'); --创建获取数据的表 create table timezone_copy(name text,abbrev text,utc_offset pg_catalog.interval,is_dst boolean); copy timezone_copy from '/opt/ timezone.csv' with (format 'csv',header 'true'); -- timezone_copy表可以获取相应数据 Select * from timezone_copy; |
示例2:从当前客户端输入进行copy
--创建获取数据的表 create table copy_from_stdin(a int, b int, c text); --执行copy from Copy copy_from_stdin from stdin; --输入以下数据,需要注意列与列之间使用TAB进行切换,新行输入\.开始执行copy --列与列之间使用空格无法识别 --使用DELIMITER选项可以指定列分隔符 Copy copy_from_stdin from stdin with(DELIMITER '|'); |
示例3:通过程序对日志信息进行copy
在data目录下执行下面命令可以对日志信息进行分割
cat current_logfiles | awk {'print $2'} | xargs cat | grep -e ERROR -e LOG -e DETAIL | grep -v '|' | awk '{printf("%s %s|%s|", $1,$2,$4); for (i=5;i<=NF;i++) printf("%s ",$i); print ""}' |
在KingbaseES中使用copy复制上述命令输出
--创建获取数据的表 create table copyLog_from_program(logtime text, CST text, INFO text); --进行copy copy copyLog_from_program from PROGRAM E'cat current_logfiles | awk {\'print $2\'} | xargs cat | grep -e ERROR -e LOG -e DETAIL | grep -v \'|\' | awk \'{printf("%s %s|%s|", $1,$2,$4); for (i=5;i<=NF;i++) printf("%s ",$i); print ""}\'' with(DELIMITER '|'); --查询表中的日志信息 Select * from copyLog_from_program; |
示例4:使用where子句筛选符合条件的数据进行copy
--创建获取数据的表 create table copy_from_where(a int, b int, c text); --执行copy from,可以发现只copy了符合where条件的数据 Copy copy_from_where from stdin where a>4; --查询表copy_from_where数据 Select * from copy_from_where; |
示例5:使用FORCE_NULL和FORCE_NOT_NULL选项(需要在csv模式下)
--创建获取数据的表 create table copy_from_FORCE_NULL (a text, b text, c text); --非csv模式将报错 Copy copy_from_FORCE_NULL from stdin with(FORCE_NULL (a)); --执行copy from,FORCE_NULL列的空值将被置为NULL,而FORCE_NOT_NULL列的空值将被视为空字符串 Copy copy_from_FORCE_NULL(a,b,c) from stdin with(format csv,FORCE_NULL (c),FORCE_NOT_NULL(b)); Select * from copy_from_FORCE_NULL; |
总结
在KingbaseES中提供了COPY命令进行KingbaseES表与文件系统之间的数据移动。本文主要介绍了COPY命令中的COPY FROM。COPY FROM命令将数据从文件、程序输出和客户端输入拷贝到数据库中。与COPY TO不同,在使用COPY FROM命令时可以提供WHERE子句对数据源进行过滤。




