首页 > 数据库 > > SQL语法-COPY
通过COPY命令实现在表和文件之间拷贝数据。
COPY FROM从一个文件拷贝数据到一个表,COPY TO把一个表的数据拷贝到一个文件。
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | STDIN }
[ [ USING ] DELIMITERS 'delimiters' ]
[ WITHOUT ESCAPING ]
[ LOG ERRORS ]
[ REJECT LIMIT 'limit' ]
[ [ WITH ] ( option [, ...] ) ]
| copy_option
| FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ];
说明:语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。
COPY table_name [ ( column_name [, ...] ) ]
TO { 'filename' | STDOUT }
[ [ USING ] DELIMITERS 'delimiters' ]
[ WITHOUT ESCAPING ]
[ [ WITH ] ( option [, ...] ) ]
| copy_option
| FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ];
COPY query
TO { 'filename' | STDOUT }
[ WITHOUT ESCAPING ]
[ [ WITH ] ( option [, ...] ) ]
| copy_option
| FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ];
说明:(query)与[USING] DELIMITER不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定[USING] DELIMITERS语法子句。
FORMAT 'format_name'
| OIDS [ boolean ]
| DELIMITER 'delimiter_character'
| NULL 'null_string'
| HEADER [ boolean ]
| FILEHEADER 'header_file_string'
| FREEZE [ boolean ]
| QUOTE 'quote_character'
| ESCAPE 'escape_character'
| EOL 'newline_character'
| NOESCAPING [ boolean ]
| FORCE_QUOTE { ( column_name [, ...] ) | * }
| FORCE_NOT_NULL ( column_name [, ...] )
| ENCODING 'encoding_name'
| IGNORE_EXTRA_DATA [ boolean ]
| FILL_MISSING_FIELDS [ boolean ]
| COMPATIBLE_ILLEGAL_CHARS [ boolean ]
| DATE_FORMAT 'date_format_string'
| TIME_FORMAT 'time_format_string'
| TIMESTAMP_FORMAT 'timestamp_format_string'
| SMALLDATETIME_FORMAT 'smalldatetime_format_string'
OIDS
| NULL 'null_string'
| HEADER
| FILEHEADER 'header_file_string'
| FREEZE
| FORCE_NOT_NULL column_name [, ...]
| FORCE_QUOTE { column_name [, ...] | * }
| BINARY
| CSV
| QUOTE [ AS ] 'quote_character'
| ESCAPE [ AS ] 'escape_character'
| EOL 'newline_character'
| ENCODING 'encoding_name'
| IGNORE_EXTRA_DATA
| FILL_MISSING_FIELDS
| COMPATIBLE_ILLEGAL_CHARS
| DATE_FORMAT 'date_format_string'
| TIME_FORMAT 'time_format_string'
| TIMESTAMP_FORMAT 'timestamp_format_string'
| SMALLDATETIME_FORMAT 'smalldatetime_format_string'
其结果将被拷贝。
取值范围:一个必须用圆括弧包围的SELECT或VALUES命令。
表的名字(可以有模式修饰)。
取值范围:已存在的表名。
可选的待拷贝字段列表。
取值范围:如果没有声明字段列表,将使用所有字段。
声明输入是来自标准输入。
声明输出打印到标准输出。
打开字段固定长度模式。在字段固定长度模式下,不能声明DELIMITER,NULL,CSV选项。指定FIXED类型后,不能再通过option或copy_option指定BINARY、CSV、TEXT等类型。
说明:定长格式定义如下:
在文件中分隔各个字段的字符串,分隔符最大长度不超过10个字节。
取值范围:不允许包含\.abcdefghijklmnopqrstuvwxyz0123456789中的任何一个字符。
缺省值:在文本模式下,缺省是水平制表符,在CSV模式下是一个逗号。
在TEXT格式中,不对'\'和后面的字符进行转义。
取值范围:仅支持TEXT格式。
若指定,则开启对于COPY FROM语句中数据类型错误的容错机制,相关错误行的错误记录会记录到此库中public.pgxc_copy_error_log表中,备后续查阅。
取值范围:仅支持导入(即COPY FROM)时指定。
说明:此容错选项的使用限制如下:
与LOG ERROR选项共同使用,对COPY FROM的容错机制设置数值上限,一旦此COPY FROM语句错误数据超过选项指定条数,则会按照原有机制报错。
取值范围:正整数(1-INTMAX),'unlimited'(无最大值限制)
缺省值:若未指定LOG ERRORS,则会报错;若指定LOG ERRORS,则默认为0。
说明:如上述LOG ERRORS中描述的容错机制,REJECT LIMIT的计数也是按照执行COPY FROM的CN上遇到的解析错误数量计算,而不是每个DN上的错误数量,这点请与GDS容错机制区别开。
在固定长度模式中,定义每一个字段在数据文件中的位置。按照column(offset,length)格式定义每一列在数据文件中的位置。
取值范围:
所有列的总长度和不能大于1GB。
文件中没有出现的列默认以空值代替。
用于指定兼容外表的各类参数。
数据源文件的格式。
取值范围:CSV、TEXT、FIXED、BINARY。
缺省值:TEXT
为每行拷贝内部对象标识(oid)。
说明:若COPY FROM对象为query或者对于没有oid的表,指定oids标识报错。
取值范围:true/on,false/off。
缺省值:false
说明:取值范围:支持多字符分隔符,但分隔符不能超过10个字节。
缺省值:
用来指定数据文件中空值的表示。
取值范围:
缺省值:
指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。header只能用于CSV,FIXED格式的文件中。
在导入数据时,如果header选项为on,则数据文本第一行会被识别为标题行,会忽略此行。如果header为off,而数据文件中第一行会被识别为数据。
在导出数据时,如果header选项为on,则需要指定fileheader。如果header为off,则导出数据文件不包含标题行。
取值范围:true/on,false/off。
缺省值:false
CSV格式文件下的引号字符。
缺省值:双引号
说明:CSV格式下,用来指定逃逸字符,逃逸字符只能指定为单字节字符。
缺省值:双引号。当与quote值相同时,会被替换为'\0'。
指定导入导出数据文件换行符样式。
取值范围:支持多字符换行符,但换行符不能超过10个字节。常见的换行符,如\r、\n、\r\n(设成0x0D、0x0A、0x0D0A效果是相同的),其他字符或字符串,如$、#。
说明:在CSV COPY TO模式下,强制在每个声明的字段周围对所有非NULL值都使用引号包围。NULL输出不会被引号包围。
取值范围:已存在的字段。
在CSV COPY FROM模式下,指定的字段输入不能为空。
取值范围:已存在的字段。
指定数据文件的编码格式名称,缺省为当前数据库编码格式。
若数据源文件比外表定义列数多,是否会忽略对多出的列。该参数只在数据导入过程中使用。
取值范围:true/on、false/off。
extra data after last expected column
缺省值:false。

如果行尾换行符丢失,使两行变成一行时,设置此参数为true将导致后一行数据被忽略掉。
导入非法字符容错参数。此语法仅对COPY FROM导入有效。
取值范围:true/on,false/off。
缺省值:false/off
说明:导入非法字符容错规则如下:
(1)对于'\0',容错后转换为空格;
(2)对于其他非法字符,容错后转换为问号;
(3)若compatible_illegal_chars为true/on标识导入时对于非法字符进行容错处理,则若NULL、DELIMITER、QUOTE、ESCAPE设置为空格或问号则会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。
当数据加载时,若数据源文件中一行的最后一个字段缺失的处理方式。
取值范围:true/on,false/off。
缺省值:false/off
导入对于DATE类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法DATE格式。可参考时间和日期处理函数和操作符。
说明:对于指定为ORACLE兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp_format参数。
导入对于TIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法TIME格式,不支持时区。可参考时间和日期处理函数和操作符。
导入对于TIMESTAMP类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法TIMESTAMP格式,不支持时区。可参考时间和日期处理函数和操作符。
导入对于SMALLDATETIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法SMALLDATETIME格式。可参考时间和日期处理函数和操作符。
用于指定COPY原生的各类参数。
说明:若COPY FROM对象为query或者对于没有oid的表,指定oids标识报错。

在使用COPY FROM的时候,任何匹配这个字符串的字符串将被存储为NULL值,所以应该确保指定的字符串和COPY TO相同。
取值范围:
缺省值:
指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。header只能用于CSV,FIXED格式的文件中。
在导入数据时,如果header选项为on,则数据文本第一行会被识别为标题行,会忽略此行。如果header为off,而数据文件中第一行会被识别为数据。
在导出数据时,如果header选项为on,则需要指定fileheader。如果header为off,则导出数据文件不包含标题行。
导出数据时用于定义标题行的文件,一般用来描述每一列的数据信息。

将COPY加载的数据行设置为已经被frozen,就像这些数据行执行过VACUUM FREEZE。
这是一个初始数据加载的性能选项。仅当以下三个条件同时满足时,数据行会被frozen:
说明:COPY完成后,所有其他会话将会立刻看到这些数据。但是这违反了MVCC可见性的一般原则,用户应当了解这样会导致潜在的风险。
在CSV COPY FROM模式下,指定的字段输入不能为空。
取值范围:已存在的字段。
在CSV COPY TO模式下,强制在每个声明的字段周围对所有非NULL值都使用引号包围。NULL输出不会被引号包围。
取值范围:已存在的字段。
使用二进制格式存储和读取,而不是以文本的方式。在二进制模式下,不能声明DELIMITER,NULL,CSV选项。指定BINARY类型后,不能再通过option或copy_option指定CSV、FIXED、TEXT等类型。
打开逗号分隔变量(CSV)模式。指定CSV类型后,不能再通过option或copy_option指定BINARY、FIXED、TEXT等类型。
CSV格式文件下的引号字符。
缺省值:双引号。
说明:CSV格式下,用来指定逃逸字符,逃逸字符只能指定为单字节字符。
默认值为双引号。当与quote值相同时,会被替换为'\0'。
指定导入导出数据文件换行符样式。
取值范围:支持多字符换行符,但换行符不能超过10个字节。常见的换行符,如\r、\n、\r\n(设成0x0D、0x0A、0x0D0A效果是相同的),其他字符或字符串,如$、#。
说明:指定文件编码格式名称。
取值范围:有效的编码格式。
缺省值:当前编码格式。
指定当数据源文件比外表定义列数多时,忽略行尾多出来的列。该参数只在数据导入过程中使用。
extra data after last expected column
指定导入时对非法字符进行容错处理,非法字符转换后入库。不报错,不中断导入。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
若不使用该参数,导入时遇到非法字符进行报错,中断导入。
说明:导入非法字符容错规则如下:
(1)对于'\0',容错后转换为空格;
(2)对于其他非法字符,容错后转换为问号;
(3)若compatible_illegal_chars为true/on标识,导入时对于非法字符进行容错处理,则若NULL、DELIMITER、QUOTE、ESCAPE设置为空格或问号则会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。
当数据加载时,若数据源文件中一行的最后一个字段缺失的处理方式。
取值范围:true/on,false/off。
缺省值:false/off。

目前COPY指定此Option实际不会生效,即不会有相应的容错处理效果(不生效)。需要额外注意的是,打开此选项会导致解析器在CN数据解析阶段(即COPY错误表容错的涵盖范围)忽略此数据问题,而到DN重新报错,从而使得COPY错误表(打开LOG ERRORS REJECT LIMIT)在此选项打开的情况下无法成功捕获这类少列的数据异常。因此请不要指定此选项。
导入对于DATE类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法DATE格式。可参考时间和日期处理函数和操作符
说明:对于指定为ORACLE兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp_format参数。
导入对于TIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法TIME格式,不支持时区。可参考时间和日期处理函数和操作符。
导入对于TIMESTAMP类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法TIMESTAMP格式,不支持时区。可参考时间和日期处理函数和操作符。
导入对于SMALLDATETIME类型指定格式。此参数不支持BINARY格式,会报“cannot specify bulkload compatibility options in BINARY mode”错误信息。此参数仅对COPY FROM导入有效。
取值范围:合法SMALLDATETIME格式。可参考时间和日期处理函数和操作符。
--将tpcds.ship_mode中的数据拷贝到/home/omm/ds_ship_mode.dat文件中。
COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat';
--将tpcds.ship_mode 输出到stdout。
COPY tpcds.ship_mode TO stdout;
--创建tpcds.ship_mode_t1表。
CREATE TABLE tpcds.ship_mode_t1
(
SM_SHIP_MODE_SK INTEGER NOT NULL,
SM_SHIP_MODE_ID CHAR(16) NOT NULL,
SM_TYPE CHAR(30) ,
SM_CODE CHAR(10) ,
SM_CARRIER CHAR(20) ,
SM_CONTRACT CHAR(20)
)
WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)
DISTRIBUTE BY HASH(SM_SHIP_MODE_SK );
--从stdin拷贝数据到表tpcds.ship_mode_t1。
COPY tpcds.ship_mode_t1 FROM stdin;
--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1。
COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat';
--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为TEXT(format 'text'),分隔符为'\t'(delimiter E'\t'),忽略多余列(ignore_extra_data 'true'),不指定转义(noescaping 'true')。
COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true');
--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header)。
COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data;
--删除tpcds.ship_mode_t1。
DROP TABLE tpcds.ship_mode_t1;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3135434/ ,如需转载,请注明出处,否则将追究法律责任。