金仓数据库KingbaseES COPY命令介绍之COPY TO
关键字:
KingbaseES、COPY、COPY TO;人大金仓;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 TO的语法
COPY TO命令支持获取KingbaseES表信息复制到文件中。需要注意的是,COPY TO命令只能用于表,无法用于视图。COPY视图需要利用视图查询语句进行复制。
COPY TO语法如下:
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) } TO { 'filename' | PROGRAM 'command' | STDOUT } [ [ WITH ] ( option [, ...] ) ] |
COPY TO的使用
示例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'); |
输出csv文件的部分内容如下,可以看到csv文件保存了列名:
|
示例2:COPY TO到当前客户端输出
copy timezone_table to stdout with (format 'csv',header 'true'); --部分输出如下 |
示例3:不支持对视图进行复制,可以使用查询的方式实现对视图的复制
--直接copy视图会执行失败 copy pg_timezone_names to 'timezone.csv' with (format 'csv',header 'true'); --copy查询语句的方式会成功执行 copy (select * from pg_timezone_names) to stdout with (format 'csv',header 'true', DELIMITER '|'); |
示例4:对有继承关系的表进行复制
--创建继承关系的表 create table parent_table(id int, name varchar(10)); create table child_table(info varchar(10) default 'text' )inherits(parent_table); --插入所需数据 insert into parent_table values(1, '1'), (2, '2'), (3, '3'); insert into child_table values(4, '1'), (5, '2'), (6, '3'); --查询父表数据,可以查到子表的记录 Select * from parent_table; --copy父表,不copy到子表的记录 Copy parent_table to stdout with (format 'csv',header 'true', DELIMITER '|'); --可以使用查询命令进行copy Copy (select * from parent_table) to stdout with (format 'csv',header 'true', DELIMITER '|'); |
示例5:copy命令也可以用于DML语句的返回备份
-- insert语句 Copy (insert into parent_table values(7, '1'), (8, '2'), (9, '3') returning *) to stdout with (format 'csv',header 'true', DELIMITER '|'); --update语句 Copy (update parent_table set name= 'update' returning *) to stdout with (format 'csv',header 'true', DELIMITER '|'); --delete语句 Copy (delete parent_table returning *) to stdout with (format 'csv',header 'true', DELIMITER '|'); --当DML语句无返回时,会报错 Copy (delete parent_table) to stdout with (format 'csv',header 'true', DELIMITER '|'); |
总结
在KingbaseES中提供了COPY命令进行KingbaseES表与文件系统之间的数据移动。本文主要介绍了COPY命令中的COPY TO。在使用COPY TO命令时,需要注意无法对视图进行拷贝。当备份DML语句时,需要注意DML语句必须有RETURNING子句。