目录
COPY FROM将文件或标准输入中的数据复制到表中,并将数据附加到表内容中。 COPY是非并行的:使用master实例在单个进程中加载数据。建议仅对非常小的数据文件使用COPY。主机上的后端进程必须可以访问COPY 源文件。指定相对于主机上的数据目录的COPY 源文件名,或指定绝对路径。客户端和master服务器之间的连接从STDIN或STDOUT复制数据。
COPY 命令要求postgres后端打开指定的文件,读取文件并将其附加到表中。为了能够读取文件,后端需要具有对文件的可读权限,并且必须使用master主机上的绝对路径或master数据目录的相对路径来指定文件名。
COPY table_name FROM /path/to/filename;
为避免在加载数据之前将数据文件复制到master主机的问题,COPY FROM STDIN使用标准输入通道并将数据直接提供给postgres后端。 COPY FROM STDIN命令启动后,后端将接受数据行,直到一行只包含反斜杠句点(\.)。
COPY table_name FROM STDIN;
不要将\copy命令与COPY SQL命令混淆。 \copy调用常规COPY FROM STDIN并将数据从客户端发送到后端。 因此,任何文件都必须驻留在运行客户端的主机上,并且必须可由运行客户端的用户访问。 为避免在加载数据之前将数据文件复制到master主机的问题,COPY FROM STDIN使用标准输入通道并将数据直接提供给数据库后端。 COPY FROM STDIN命令启动后,后端将接受数据行,直到一行只包含反斜杠句点(\.)。
\copy table_name FROM filename;
COPY FROM接受FORMAT参数,该参数指定输入数据的格式。可能的值为TEXT,CSV(逗号分隔值)和BINARY。
COPY table_name FROM /path/to/filename WITH (FORMAT csv);
COPY table_name FROM /path/to/filename WITH (FORMAT text, DELIMITER '|');
默认情况下,使用默认客户端编码,可以使用ENCODING选项更改此编码。这对于来自其他操作系统的数据会非常有用。
COPY table_name FROM /path/to/filename WITH (ENCODING 'latin1');
默认情况下,COPY会在第一个错误处停止操作:如果数据包含一个错误,该操作失败并且没有数据被装载。如果用户在单行错误隔离模式中运行COPY FROM,数据库会跳过包含格式错误的行并且装载正确格式化的行。单行错误隔离模式只适用于包含格式错误的输入文件中的行。如果数据包含的是约束错误,例如违背NOT NULL,CHECK,或者 UNIQUE约束,操作还是会失败并且不会有数据被装载。指定SEGMENT REJECT LIMIT 会把COPY操作运行在单行错误隔离模式中。指定每一个实例上可接受的错误行数,在达到这个行数后整个COPY FROM操作失败并且不会有数据被装载。这个错误行计数是针对每个数据库的实例,而不是针对整个装载操作。
如果COPY操作没有达到操作限制,数据库会装载所有正确格式化的行并且丢弃错误行。使用LOG ERRORS子句可以捕获数据库内部的数据格式化错误。例如:
- => COPY country FROM '/data/gpdb/country_data'
- WITH DELIMITER '|' LOG ERRORS
- SEGMENT REJECT LIMIT 10 ROWS;
使用下列技巧优化数据装载和后续的查询性能。