金仓数据库KingbaseES中COPY TO的介绍(二)
关键字:
KingbaseES、COPY、人大金仓
COPY TO的部分语法
COPY … TO …[ [ WITH ] ( option [, ...] ) ]
上一次,已经对COPT TO 的语法进行了部分介绍,这次介绍一下option可以是什么:
FORMAT format_name
选择要读取或者写入的数据格式: text 、 csv (逗号分隔值)或者 binary 。默认是 text 。
FREEZE [ boolean ]
请求复制已经完成了行冻结的数据,就好像在运行 VACUUM FREEZE 命令之后复制。这是为了初始数据载入的性能而设计的。只有被载入表已经在当前子事务中被创建或截断、该事务中没有游标打开并且该事务没有持有更旧的快照时,行才会被冻结。目前无法在分区表上执行 COPY FREEZE 。
DELIMITER 'delimiter_character'
指定分隔文件每行中各列的字符。文本格式中默认是一个制表符,而 CSV 格式中默认是一个逗号。KingbaseES支持设置不大于8个字节的分隔符。使用 binary 格式时不允许这个选项。
TERMINATOR 'terminator_character'
指定文本中每行中换行的字符。默认换行符为 \r 、 \n 、 \r\n 。 KingbaseES支持设置不大于8个字节的分隔符,使用 binary 格式时不允许这个选项。 KingbaseES兼容Oracle模式支持,而兼容PostgreSQL模式不支持。
NULL 'null_string'
指定表示一个空值的字符串。文本格式中默认是 \N (反斜线-N), CSV 格式中默认是一个未加引用的空串。在你不想区分空值和空串的情况下,即使在文本格式中你也可能更喜欢空串。使用 binary 格式时不允许这个选项。
HEADER [ boolean ]
指定文件包含标题行,其中有每一列的名称。在输出时,第一行包含来自表的列名。在输入时,第一行会被忽略。只有使用 CSV 格式时才允许这个选项。
COPY TO的实例
- COPY table_name TO 'filename' WITH (FORMAT format_name)
FORMAT可以指定文件格式,可以指定的格式有text(默认),csv和binary
test=# copy t1 to '/home/zhangnan/a.text' with (format text);
COPY 1
test=# copy t1 to '/home/zhangnan/b.csv' with (format csv);
COPY 1
test=# copy t1 to '/home/zhangnan/b' with (format binary);
COPY 1
也可以不带WITH
test=# copy t1 to '/home/zhangnan/a.text' (format text);
COPY 1
- COPY table_name TO 'filename' WITH (FREEZE [ boolean ])
FREEZE选项主要用于将复制的数据按照冻结格式存储在输出文件中,冻结数据是一种优化存储格式,它可以在某种场景下提高查询性能。
test=# copy t1 to '/home/zhangnan/b.csv' with (freeze);
COPY 1
同样,WITH可以不带
test=# copy t1 to '/home/zhangnan/b.csv' (freeze);
COPY 1
- COPY table_name TO 'filename' WITH DELIMITER 'delimiter_character'
test=# copy t1 to '/home/zhangnan/t1.txt' (DELIMITER '|');
COPY 1
delimiter_character的范围只可以是符号和大写字母,不支持数字和字母。
test=# copy t1 to '/home/zhangnan/t1.txt' (DELIMITER '1');
ERROR: COPY delimiter cannot be "1"
test=# copy t1 to '/home/zhangnan/t1.txt' (DELIMITER 'a');
ERROR: COPY delimiter cannot be "a"
test=# copy t1 to '/home/zhangnan/t1.txt' (DELIMITER 'A');
COPY 1
test=# copy t1 to '/home/zhangnan/t1.txt' DELIMITER 'A';
COPY 1
test=# copy t1 to '/home/zhangnan/t1.txt' (DELIMITER '=');
COPY 1
- COPY table_name TO 'filename' WITH TERMINATOR 'terminator_character'
使用该选项后,可以更改数据中的换行符。
test=# copy t1 to '/home/zhangnan/t1.txt' (terminator '#');
COPY 1
[zhangnan@kes_0_14 ~]$ cat t1.txt
1 sss#[zhangnan@kes_0_14 ~]$ cat t1.txt
- COPY table_name TO 'filename' WITH NULL 'null_string'
该字段可以实现,将复制表中数据时,若碰到空字符串,用null_string代替
test=# select * from t1;
a | b
---+-----
1 | sss
1 |
(2 rows)
test=# copy t1 to '/home/zhangnan/t1.txt' null 'x';
COPY 2
[zhangnan@kes_0_14 ~]$ cat t1.txt
1 sss
- x
- COPY table_name TO 'filename' WITH HEADER [ boolean ]
HEADER选项可以在复制时,将表的列明等信息一同复制:
test=# copy t1 to stdout csv header;
a,b
1,sss
1,
总结
COPY TO命令中通过这些OPTION,可以按照用户需求导出数据,并灵活地进行设置,为数据导出提供了更好地控制和可定制性,使用户能够更方便地处理导出的数据。
参考资料
提供该题目相关内容在产品手册中可以系统学习的位置,例如: