人大金仓数据库KingbaseES中COPY TO的介绍(二)

290 阅读3分钟

金仓数据库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

  1. 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,可以按照用户需求导出数据,并灵活地进行设置,为数据导出提供了更好地控制和可定制性,使用户能够更方便地处理导出的数据。

参考资料

提供该题目相关内容在产品手册中可以系统学习的位置,例如:

《KingbaseES SQL语言参考手册》