{"Entry":{"collection":"sql","key":"copy","name":"COPY","aliases":["copy"],"metadata":{"aliases":["copy"],"changed_in":["7.0","7.3","7.4","8.0","8.1","8.2","9.0","9.1","9.2","9.3","9.4","12","15","16","17","18","19"],"changes":[{"from":"6.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","other"],"removed":["bugs"]},"status":"changed","synopsis":null,"to":"6.5"},{"from":"6.5","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","other"],"removed":[]},"status":"changed","synopsis":{"added":["[ [USING] DELIMITERS 'delimiter' ]","[ WITH NULL AS 'null string' ]","[ [USING] DELIMITERS 'delimiter' ]","[ WITH NULL AS 'null string' ]"],"removed":[]},"to":"7.0"},{"from":"7.0","purpose_changed":false,"renamed":{"from_file":"sql-copy.htm","to_file":"sql-copy.html"},"sections":{"added":[],"changed":["description","other","usage"],"removed":[]},"status":"changed","synopsis":null,"to":"7.1"},{"from":"7.1","purpose_changed":true,"renamed":null,"sections":{"added":[],"changed":["description","other"],"removed":[]},"status":"changed","synopsis":null,"to":"7.2"},{"from":"7.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","other","usage","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["COPY table [ ( column [, ...] ) ]","[ [ WITH ]","[ BINARY ]","[ OIDS ]","[ DELIMITER [ AS ] 'delimiter' ]","[ NULL [ AS ] 'null string' ] ]","COPY table [ ( column [, ...] ) ]","[ [ WITH ]","[ BINARY ]","[ OIDS ]","[ DELIMITER [ AS ] 'delimiter' ]","[ NULL [ AS ] 'null string' ] ]"],"removed":["COPY [ BINARY ] table [ WITH OIDS ]","[ [USING] DELIMITERS 'delimiter' ]","[ WITH NULL AS 'null string' ]","COPY [ BINARY ] table [ WITH OIDS ]","[ [USING] DELIMITERS 'delimiter' ]","[ WITH NULL AS 'null string' ]"]},"to":"7.3"},{"from":"7.3","purpose_changed":true,"renamed":null,"sections":{"added":["parameters","notes","examples"],"changed":["description","other","compatibility"],"removed":["usage"]},"status":"changed","synopsis":{"added":["COPY tablename [ ( column [, ...] ) ]","FROM { 'filename' | STDIN }","COPY tablename [ ( column [, ...] ) ]","TO { 'filename' | STDOUT }"],"removed":["COPY table [ ( column [, ...] ) ]","FROM { 'filename' | stdin }","COPY table [ ( column [, ...] ) ]","TO { 'filename' | stdout }"]},"to":"7.4"},{"from":"7.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","notes","other"],"removed":[]},"status":"changed","synopsis":{"added":["[ NULL [ AS ] 'null string' ]","[ CSV [ QUOTE [ AS ] 'quote' ]","[ ESCAPE [ AS ] 'escape' ]","[ FORCE NOT NULL column [, ...] ]","[ CSV [ QUOTE [ AS ] 'quote' ]","[ ESCAPE [ AS ] 'escape' ]","[ FORCE QUOTE column [, ...] ]"],"removed":[]},"to":"8.0"},{"from":"8.0","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","other","examples"],"removed":[]},"status":"changed","synopsis":{"added":["[ CSV [ HEADER ]","[ CSV [ HEADER ]","[ QUOTE [ AS ] 'quote' ]"],"removed":[]},"to":"8.1"},{"from":"8.1","purpose_changed":false,"renamed":null,"sections":{"added":["outputs"],"changed":["description","parameters","notes","examples"],"removed":[]},"status":"changed","synopsis":{"added":["COPY { tablename [ ( column [, ...] ) ] | ( query ) }"],"removed":[]},"to":"8.2"},{"from":"8.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["notes","other"],"removed":[]},"status":"changed","synopsis":null,"to":"8.3"},{"from":"8.3","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","notes","other"],"removed":[]},"status":"changed","synopsis":null,"to":"8.4"},{"from":"8.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","notes","other","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["COPY table_name [ ( column [, ...] ) ]","[ [ WITH ] ( option [, ...] ) ]","COPY { table_name [ ( column [, ...] ) ] | ( query ) }","[ [ WITH ] ( option [, ...] ) ]","FORMAT format_name","OIDS [ boolean ]","DELIMITER 'delimiter_character'","NULL 'null_string'","HEADER [ boolean ]","QUOTE 'quote_character'","ESCAPE 'escape_character'","FORCE_QUOTE { ( column [, ...] ) | * }","FORCE_NOT_NULL ( column [, ...] )"],"removed":["COPY tablename [ ( column [, ...] ) ]","[ BINARY ]","[ OIDS ]","[ DELIMITER [ AS ] 'delimiter' ]","[ NULL [ AS ] 'null string' ]","[ CSV [ HEADER ]","[ QUOTE [ AS ] 'quote' ]","[ ESCAPE [ AS ] 'escape' ]","[ FORCE NOT NULL column [, ...] ]","COPY { tablename [ ( column [, ...] ) ] | ( query ) }","[ BINARY ]","[ OIDS ]","[ DELIMITER [ AS ] 'delimiter' ]","[ NULL [ AS ] 'null string' ]","[ CSV [ HEADER ]","[ QUOTE [ AS ] 'quote' ]","[ ESCAPE [ AS ] 'escape' ]","[ FORCE QUOTE column [, ...] ]"]},"to":"9.0"},{"from":"9.0","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","notes"],"removed":[]},"status":"changed","synopsis":{"added":["ENCODING 'encoding_name'"],"removed":[]},"to":"9.1"},{"from":"9.1","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["COPY table_name [ ( column_name [, ...] ) ]","COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }","FORCE_QUOTE { ( column_name [, ...] ) | * }","FORCE_NOT_NULL ( column_name [, ...] )"],"removed":["COPY table_name [ ( column [, ...] ) ]","COPY { table_name [ ( column [, ...] ) ] | ( query ) }","FORCE_QUOTE { ( column [, ...] ) | * }","FORCE_NOT_NULL ( column [, ...] )"]},"to":"9.2"},{"from":"9.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","notes","examples"],"removed":[]},"status":"changed","synopsis":{"added":["FROM { 'filename' | PROGRAM 'command' | STDIN }","TO { 'filename' | PROGRAM 'command' | STDOUT }","OIDS [ boolean ]","FREEZE [ boolean ]"],"removed":[]},"to":"9.3"},{"from":"9.3","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","outputs","notes","other","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["FORCE_NULL ( column_name [, ...] )"],"removed":[]},"to":"9.4"},{"from":"9.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["notes"],"removed":[]},"status":"changed","synopsis":null,"to":"9.5"},{"from":"9.5","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","other"],"removed":[]},"status":"changed","synopsis":null,"to":"9.6"},{"from":"9.6","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","outputs","notes","other"],"removed":[]},"status":"changed","synopsis":null,"to":"10"},{"from":"10","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["notes"],"removed":[]},"status":"changed","synopsis":null,"to":"11"},{"from":"11","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","other","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ [ WITH ] ( option [, ...] ) ]","[ WHERE condition ]"],"removed":["OIDS [ boolean ]"]},"to":"12"},{"from":"12","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["other"],"removed":[]},"status":"changed","synopsis":null,"to":"13"},{"from":"13","purpose_changed":false,"renamed":null,"sections":{"added":["see_also"],"changed":["description","parameters","notes"],"removed":[]},"status":"changed","synopsis":null,"to":"14"},{"from":"14","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["HEADER [ boolean | MATCH ]"],"removed":[]},"to":"15"},{"from":"15","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","see_also"],"removed":[]},"status":"changed","synopsis":{"added":["DEFAULT 'default_string'"],"removed":[]},"to":"16"},{"from":"16","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","notes","see_also"],"removed":[]},"status":"changed","synopsis":{"added":["FORCE_NOT_NULL { ( column_name [, ...] ) | * }","FORCE_NULL { ( column_name [, ...] ) | * }","ON_ERROR error_action","LOG_VERBOSITY verbosity"],"removed":[]},"to":"17"},{"from":"17","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","notes","other"],"removed":[]},"status":"changed","synopsis":{"added":["REJECT_LIMIT maxerror"],"removed":[]},"to":"18"},{"from":"18","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","notes","examples"],"removed":[]},"status":"changed","synopsis":{"added":["HEADER [ boolean | integer | MATCH ]","FORCE_ARRAY [ boolean ]"],"removed":[]},"to":"19"}],"content_hash":"153d1187c0cc3f7043401897c86d3c8ec5bcdbd619ff3ad2f311cc3cd5ebf445","editorial":{},"first_version":"6.4","group":"query","imported_at":"2026-09-27T17:57:26.963752+08:00","last_version":"20","name":"COPY","object":"","position":11000,"present_in":["6.4","6.5","7.0","7.1","7.2","7.3","7.4","8.0","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6","10","11","12","13","14","15","16","17","18","19","20"],"purpose":"copy data between a file and a table","purpose_zh":"","related":[],"slug":"copy","source_rev":"b7bd9cda","synopsis":"COPY table_name [ ( column_name [, ...] ) ]\nFROM { 'filename' | PROGRAM 'command' | STDIN }\n[ [ WITH ] ( option [, ...] ) ]\n[ WHERE condition ]\n\nCOPY { table_name [ ( column_name [, ...] ) ] | ( query ) }\nTO { 'filename' | PROGRAM 'command' | STDOUT }\n[ [ WITH ] ( option [, ...] ) ]\n\nwhere option can be one of:\n\nFORMAT format_name\nFREEZE [ boolean ]\nDELIMITER 'delimiter_character'\nNULL 'null_string'\nDEFAULT 'default_string'\nHEADER [ boolean | integer | MATCH ]\nQUOTE 'quote_character'\nESCAPE 'escape_character'\nFORCE_ARRAY [ boolean ]\nFORCE_QUOTE { ( column_name [, ...] ) | * }\nFORCE_NOT_NULL { ( column_name [, ...] ) | * }\nFORCE_NULL { ( column_name [, ...] ) | * }\nON_ERROR error_action\nREJECT_LIMIT maxerror\nENCODING 'encoding_name'\nLOG_VERBOSITY verbosity","verb":"COPY"}},"Definition":{"Collection":"sql","Key":"copy","SourceDatabase":"center","Version":"18","SourceTable":"sqlcmd","SourceKey":"copy","SourceRevision":"b7bd9cda","Facts":{"anchor":"SQL-COPY","file":"sql-copy.html","lang":"en","name":"COPY","purpose":"copy data between a file and a table","purpose_zh":"","related":[],"sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e moves data between \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e tables and standard file-system files. \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e copies the contents of a table \u003cspan class=\"emphasis\"\u003e\u003cem\u003eto\u003c/em\u003e\u003c/span\u003e a file, while \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e copies data \u003cspan class=\"emphasis\"\u003e\u003cem\u003efrom\u003c/em\u003e\u003c/span\u003e a file to a table (appending the data to whatever is in the table already). \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e can also copy the results of a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e query.\u003c/p\u003e\u003cp\u003eIf a column list is specified, \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e copies only the data in the specified columns to the file. For \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e, each field in the file is inserted, in order, into the specified column. Table columns not specified in the \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e column list will receive their default values.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e with a file name instructs the \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e server to directly read from or write to a file. The file must be accessible by the \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e user (the user ID the server runs as) and the name must be specified from the viewpoint of the server. When \u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e is specified, the server executes the given command and reads from the standard output of the program, or writes to the standard input of the program. The command must be specified from the viewpoint of the server, and be executable by the \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e user. When \u003ccode class=\"literal\"\u003eSTDIN\u003c/code\u003e or \u003ccode class=\"literal\"\u003eSTDOUT\u003c/code\u003e is specified, data is transmitted via the connection between the client and the server.\u003c/p\u003e\u003cp\u003eEach backend running \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e will report its progress in the \u003ccode class=\"structname\"\u003epg_stat_progress_copy\u003c/code\u003e view. See \u003ca href=\"/docs/18/progress-reporting.html#COPY-PROGRESS-REPORTING\" title=\"27.4.3. COPY Progress Reporting\"\u003eSection 27.4.3\u003c/a\u003e for details.\u003c/p\u003e\u003cp\u003eBy default, \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e will fail if it encounters an error during processing. For use cases where a best-effort attempt at loading the entire file is desired, the \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e clause can be used to specify some other behavior.\u003c/p\u003e","key":"description","title":"Description"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name (optionally schema-qualified) of an existing table.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eAn optional list of columns to be copied. If no column list is specified, all columns of the table except generated columns will be copied.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA \u003ca href=\"/docs/18/sql-select.html\" title=\"SELECT\"\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"/docs/18/sql-values.html\" title=\"VALUES\"\u003e\u003ccode class=\"command\"\u003eVALUES\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"/docs/18/sql-insert.html\" title=\"INSERT\"\u003e\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"/docs/18/sql-update.html\" title=\"UPDATE\"\u003e\u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"/docs/18/sql-delete.html\" title=\"DELETE\"\u003e\u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e\u003c/a\u003e, or \u003ca href=\"/docs/18/sql-merge.html\" title=\"MERGE\"\u003e\u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e\u003c/a\u003e command whose results are to be copied. Note that parentheses are required around the query.\u003c/p\u003e\u003cp\u003eFor \u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e, \u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e, \u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e, and \u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e queries a \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e clause must be provided, and the target relation must not have a conditional rule, nor an \u003ccode class=\"literal\"\u003eALSO\u003c/code\u003e rule, nor an \u003ccode class=\"literal\"\u003eINSTEAD\u003c/code\u003e rule that expands to multiple statements.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe path name of the input or output file. An input file name can be an absolute or relative path, but an output file name must be an absolute path. Windows users might need to use an \u003ccode class=\"literal\"\u003eE''\u003c/code\u003e string and double any backslashes used in the path name.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA command to execute. In \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e, the input is read from standard output of the command, and in \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e, the output is written to the standard input of the command.\u003c/p\u003e\u003cp\u003eNote that the command is invoked by the shell, so if you need to pass any arguments that come from an untrusted source, you must be careful to strip or escape any special characters that might have a special meaning for the shell. For security reasons, it is best to use a fixed command string, or at least avoid including any user input in it.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTDIN\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies that input comes from the client application.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTDOUT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies that output goes to the client application.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies whether the selected option should be turned on or off. You can write \u003ccode class=\"literal\"\u003eTRUE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eON\u003c/code\u003e, or \u003ccode class=\"literal\"\u003e1\u003c/code\u003e to enable the option, and \u003ccode class=\"literal\"\u003eFALSE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eOFF\u003c/code\u003e, or \u003ccode class=\"literal\"\u003e0\u003c/code\u003e to disable it. The \u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e value can also be omitted, in which case \u003ccode class=\"literal\"\u003eTRUE\u003c/code\u003e is assumed.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORMAT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSelects the data format to be read or written: \u003ccode class=\"literal\"\u003etext\u003c/code\u003e, \u003ccode class=\"literal\"\u003ecsv\u003c/code\u003e (Comma Separated Values), or \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e. The default is \u003ccode class=\"literal\"\u003etext\u003c/code\u003e. See \u003ca href=\"/docs/18/sql-copy.html#SQL-COPY-FILE-FORMATS\" title=\"File Formats\"\u003eFile Formats\u003c/a\u003e below for details.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFREEZE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eRequests copying the data with rows already frozen, just as they would be after running the \u003ccode class=\"command\"\u003eVACUUM FREEZE\u003c/code\u003e command. This is intended as a performance option for initial data loading. Rows will be frozen only if the table being loaded has been created or truncated in the current subtransaction, there are no cursors open and there are no older snapshots held by this transaction. It is currently not possible to perform a \u003ccode class=\"command\"\u003eCOPY FREEZE\u003c/code\u003e on a partitioned table or foreign table. This option is only allowed in \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eNote that all other sessions will immediately be able to see the data once it has been successfully loaded. This violates the normal rules of MVCC visibility and users should be aware of the potential problems this might cause.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eDELIMITER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the character that separates columns within each row (line) of the file. The default is a tab character in text format, a comma in \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format. This must be a single one-byte character. This option is not allowed when using \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the string that represents a null value. The default is \u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e (backslash-N) in text format, and an unquoted empty string in \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format. You might prefer an empty string even in text format for cases where you don't want to distinguish nulls from empty strings. This option is not allowed when using \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e format.\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003eWhen using \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e, any data item that matches this string will be stored as a null value, so you should make sure that you use the same string as you used with \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eDEFAULT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the string that represents a default value. Each time the string is found in the input file, the default value of the corresponding column will be used. This option is allowed only in \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e, and only when not using \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eHEADER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies that the file contains a header line with the names of each column in the file. On output, the first line contains the column names from the table. On input, the first line is discarded when this option is set to \u003ccode class=\"literal\"\u003etrue\u003c/code\u003e (or equivalent Boolean value). If this option is set to \u003ccode class=\"literal\"\u003eMATCH\u003c/code\u003e, the number and names of the columns in the header line must match the actual column names of the table, in order; otherwise an error is raised. This option is not allowed when using \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e format. The \u003ccode class=\"literal\"\u003eMATCH\u003c/code\u003e option is only valid for \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e commands.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the quoting character to be used when a data value is quoted. The default is double-quote. This must be a single one-byte character. This option is allowed only when using \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eESCAPE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the character that should appear before a data character that matches the \u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e value. The default is the same as the \u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e value (so that the quoting character is doubled if it appears in the data). This must be a single one-byte character. This option is allowed only when using \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORCE_QUOTE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eForces quoting to be used for all non-\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e values in each specified column. \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e output is never quoted. If \u003ccode class=\"literal\"\u003e*\u003c/code\u003e is specified, non-\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e values will be quoted in all columns. This option is allowed only in \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e, and only when using \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORCE_NOT_NULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eDo not match the specified columns' values against the null string. In the default case where the null string is empty, this means that empty values will be read as zero-length strings rather than nulls, even when they are not quoted. If \u003ccode class=\"literal\"\u003e*\u003c/code\u003e is specified, the option will be applied to all columns. This option is allowed only in \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e, and only when using \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORCE_NULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eMatch the specified columns' values against the null string, even if it has been quoted, and if a match is found set the value to \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e. In the default case where the null string is empty, this converts a quoted empty string into NULL. If \u003ccode class=\"literal\"\u003e*\u003c/code\u003e is specified, the option will be applied to all columns. This option is allowed only in \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e, and only when using \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies how to behave when encountering an error converting a column's input value into its data type. An \u003cem class=\"replaceable\"\u003e\u003ccode\u003eerror_action\u003c/code\u003e\u003c/em\u003e value of \u003ccode class=\"literal\"\u003estop\u003c/code\u003e means fail the command, while \u003ccode class=\"literal\"\u003eignore\u003c/code\u003e means discard the input row and continue with the next one. The default is \u003ccode class=\"literal\"\u003estop\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eignore\u003c/code\u003e option is applicable only for \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e when the \u003ccode class=\"literal\"\u003eFORMAT\u003c/code\u003e is \u003ccode class=\"literal\"\u003etext\u003c/code\u003e or \u003ccode class=\"literal\"\u003ecsv\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eA \u003ccode class=\"literal\"\u003eNOTICE\u003c/code\u003e message containing the ignored row count is emitted at the end of the \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e if at least one row was discarded. When \u003ccode class=\"literal\"\u003eLOG_VERBOSITY\u003c/code\u003e option is set to \u003ccode class=\"literal\"\u003everbose\u003c/code\u003e, a \u003ccode class=\"literal\"\u003eNOTICE\u003c/code\u003e message containing the line of the input file and the column name whose input conversion has failed is emitted for each discarded row. When it is set to \u003ccode class=\"literal\"\u003esilent\u003c/code\u003e, no message is emitted regarding ignored rows.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eREJECT_LIMIT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the maximum number of errors tolerated while converting a column's input value to its data type, when \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e is set to \u003ccode class=\"literal\"\u003eignore\u003c/code\u003e. If the input causes more errors than the specified value, the \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e command fails, even with \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e set to \u003ccode class=\"literal\"\u003eignore\u003c/code\u003e. This clause must be used with \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e=\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e and \u003cem class=\"replaceable\"\u003e\u003ccode\u003emaxerror\u003c/code\u003e\u003c/em\u003e must be positive \u003ccode class=\"type\"\u003ebigint\u003c/code\u003e. If not specified, \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e=\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e allows an unlimited number of errors, meaning \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e will skip all erroneous data.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eENCODING\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies that the file is encoded in the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eencoding_name\u003c/code\u003e\u003c/em\u003e. If this option is omitted, the current client encoding is used. See the Notes below for more details.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eLOG_VERBOSITY\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSpecifies the amount of messages emitted by a \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e command: \u003ccode class=\"literal\"\u003edefault\u003c/code\u003e, \u003ccode class=\"literal\"\u003everbose\u003c/code\u003e, or \u003ccode class=\"literal\"\u003esilent\u003c/code\u003e. If \u003ccode class=\"literal\"\u003everbose\u003c/code\u003e is specified, additional messages are emitted during processing. \u003ccode class=\"literal\"\u003esilent\u003c/code\u003e suppresses both verbose and default messages.\u003c/p\u003e\u003cp\u003eThis is currently used in \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e command when \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e option is set to \u003ccode class=\"literal\"\u003eignore\u003c/code\u003e.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clause has the general form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eWHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e is any expression that evaluates to a result of type \u003ccode class=\"type\"\u003eboolean\u003c/code\u003e. Any row that does not satisfy this condition will not be inserted to the table. A row satisfies the condition if it returns true when the actual row values are substituted for any variable references.\u003c/p\u003e\u003cp\u003eCurrently, subqueries and generated columns are not allowed in \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e expressions, and the evaluation does not see any changes made by the \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e itself (this matters when the expression contains calls to \u003ccode class=\"literal\"\u003eVOLATILE\u003c/code\u003e functions).\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"Parameters"},{"html":"\u003cp\u003eOn successful completion, a \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e command returns a command tag of the form\u003c/p\u003e\u003cpre class=\"screen\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003eThe \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e is the number of rows copied.\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"application\"\u003epsql\u003c/span\u003e will print this command tag only if the command was not \u003ccode class=\"literal\"\u003eCOPY ... TO STDOUT\u003c/code\u003e, or the equivalent \u003cspan class=\"application\"\u003epsql\u003c/span\u003e meta-command \u003ccode class=\"literal\"\u003e\\copy ... to stdout\u003c/code\u003e. This is to prevent confusing the command tag with the data that was just printed.\u003c/p\u003e\u003c/div\u003e","key":"outputs","title":"Outputs"},{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e can be used with plain tables and populated materialized views. For example, \u003ccode class=\"literal\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e TO\u003c/code\u003e copies the same rows as \u003ccode class=\"literal\"\u003eSELECT * FROM ONLY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e. However it doesn't directly support other relation types, such as partitioned tables, inheritance child tables, or views. To copy all rows from such relations, use \u003ccode class=\"literal\"\u003eCOPY (SELECT * FROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e) TO\u003c/code\u003e.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e can be used with plain, foreign, or partitioned tables or with views that have \u003ccode class=\"literal\"\u003eINSTEAD OF INSERT\u003c/code\u003e triggers.\u003c/p\u003e\u003cp\u003eYou must have select privilege on the table whose values are read by \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e, and insert privilege on the table into which values are inserted by \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e. It is sufficient to have column privileges on the column(s) listed in the command.\u003c/p\u003e\u003cp\u003eIf row-level security is enabled for the table, the relevant \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e policies will apply to \u003ccode class=\"literal\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e TO\u003c/code\u003e statements. Currently, \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e is not supported for tables with row-level security. Use equivalent \u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e statements instead.\u003c/p\u003e\u003cp\u003eFiles named in a \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e command are read or written directly by the server, not by the client application. Therefore, they must reside on or be accessible to the database server machine, not the client. They must be accessible to and readable or writable by the \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e user (the user ID the server runs as), not the client. Similarly, the command specified with \u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e is executed directly by the server, not by the client application, must be executable by the \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e user. \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e naming a file or command is only allowed to database superusers or users who are granted one of the roles \u003ccode class=\"literal\"\u003epg_read_server_files\u003c/code\u003e, \u003ccode class=\"literal\"\u003epg_write_server_files\u003c/code\u003e, or \u003ccode class=\"literal\"\u003epg_execute_server_program\u003c/code\u003e, since it allows reading or writing any file or running a program that the server has privileges to access.\u003c/p\u003e\u003cp\u003eDo not confuse \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e with the \u003cspan class=\"application\"\u003epsql\u003c/span\u003e instruction \u003ccode class=\"command\"\u003e\u003ca href=\"/docs/18/app-psql.html#APP-PSQL-META-COMMANDS-COPY\"\u003e\\copy\u003c/a\u003e\u003c/code\u003e. \u003ccode class=\"command\"\u003e\\copy\u003c/code\u003e invokes \u003ccode class=\"command\"\u003eCOPY FROM STDIN\u003c/code\u003e or \u003ccode class=\"command\"\u003eCOPY TO STDOUT\u003c/code\u003e, and then fetches/stores the data in a file accessible to the \u003cspan class=\"application\"\u003epsql\u003c/span\u003e client. Thus, file accessibility and access rights depend on the client rather than the server when \u003ccode class=\"command\"\u003e\\copy\u003c/code\u003e is used.\u003c/p\u003e\u003cp\u003eIt is recommended that the file name used in \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e always be specified as an absolute path. This is enforced by the server in the case of \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e, but for \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e you do have the option of reading from a file specified by a relative path. The path will be interpreted relative to the working directory of the server process (normally the cluster's data directory), not the client's working directory.\u003c/p\u003e\u003cp\u003eExecuting a command with \u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e might be restricted by the operating system's access control mechanisms, such as SELinux.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e will invoke any triggers and check constraints on the destination table. However, it will not invoke rules.\u003c/p\u003e\u003cp\u003eFor identity columns, the \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e command will always write the column values provided in the input data, like the \u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e option \u003ccode class=\"literal\"\u003eOVERRIDING SYSTEM VALUE\u003c/code\u003e.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e input and output is affected by \u003ccode class=\"varname\"\u003eDateStyle\u003c/code\u003e. To ensure portability to other \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e installations that might use non-default \u003ccode class=\"varname\"\u003eDateStyle\u003c/code\u003e settings, \u003ccode class=\"varname\"\u003eDateStyle\u003c/code\u003e should be set to \u003ccode class=\"literal\"\u003eISO\u003c/code\u003e before using \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e. It is also a good idea to avoid dumping data with \u003ccode class=\"varname\"\u003eIntervalStyle\u003c/code\u003e set to \u003ccode class=\"literal\"\u003esql_standard\u003c/code\u003e, because negative interval values might be misinterpreted by a server that has a different setting for \u003ccode class=\"varname\"\u003eIntervalStyle\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eInput data is interpreted according to \u003ccode class=\"literal\"\u003eENCODING\u003c/code\u003e option or the current client encoding, and output data is encoded in \u003ccode class=\"literal\"\u003eENCODING\u003c/code\u003e or the current client encoding, even if the data does not pass through the client but is read from or written to a file directly by the server.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e command physically inserts input rows into the table as it progresses. If the command fails, these rows are left in a deleted state; these rows will not be visible, but still occupy disk space. This might amount to considerable wasted disk space if the failure happened well into a large copy operation. \u003ccode class=\"command\"\u003eVACUUM\u003c/code\u003e should be used to recover the wasted space.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFORCE_NULL\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFORCE_NOT_NULL\u003c/code\u003e can be used simultaneously on the same column. This results in converting quoted null strings to null values and unquoted null strings to empty strings.\u003c/p\u003e","key":"notes","title":"Notes"},{"html":"\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eText Format\u003c/h3\u003e\u003cp\u003eWhen the \u003ccode class=\"literal\"\u003etext\u003c/code\u003e format is used, the data read or written is a text file with one line per table row. Columns in a row are separated by the delimiter character. The column values themselves are strings generated by the output function, or acceptable to the input function, of each attribute's data type. The specified null string is used in place of columns that are null. \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e will raise an error if any line of the input file contains more or fewer columns than are expected.\u003c/p\u003e\u003cp\u003eEnd of data can be represented by a line containing just backslash-period (\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e). An end-of-data marker is not necessary when reading from a file, since the end of file serves perfectly well; in that context this provision exists only for backward compatibility. However, \u003cspan class=\"application\"\u003epsql\u003c/span\u003e uses \u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e to terminate a \u003ccode class=\"literal\"\u003eCOPY FROM STDIN\u003c/code\u003e operation (that is, reading in-line \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e data in an SQL script). In that context the rule is needed to be able to end the operation before the end of the script.\u003c/p\u003e\u003cp\u003eBackslash characters (\u003ccode class=\"literal\"\u003e\\\u003c/code\u003e) can be used in the \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e data to quote data characters that might otherwise be taken as row or column delimiters. In particular, the following characters \u003cspan class=\"emphasis\"\u003e\u003cem\u003emust\u003c/em\u003e\u003c/span\u003e be preceded by a backslash if they appear as part of a column value: backslash itself, newline, carriage return, and the current delimiter character.\u003c/p\u003e\u003cp\u003eThe specified null string is sent by \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e without adding any backslashes; conversely, \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e matches the input against the null string before removing backslashes. Therefore, a null string such as \u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e cannot be confused with the actual data value \u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e (which would be represented as \u003ccode class=\"literal\"\u003e\\\\N\u003c/code\u003e).\u003c/p\u003e\u003cp\u003eThe following special backslash sequences are recognized by \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e:\u003c/p\u003e\u003cdiv class=\"informaltable\"\u003e\u003ctable class=\"informaltable\"\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003eSequence\u003c/th\u003e\u003cth\u003eRepresents\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\b\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBackspace (ASCII 8)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\f\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eForm feed (ASCII 12)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eNewline (ASCII 10)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\r\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eCarriage return (ASCII 13)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\t\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTab (ASCII 9)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\v\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eVertical tab (ASCII 11)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\\u003c/code\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003edigits\u003c/code\u003e\u003c/em\u003e\u003c/td\u003e\u003ctd\u003eBackslash followed by one to three octal digits specifies the byte with that numeric code\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\x\u003c/code\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003edigits\u003c/code\u003e\u003c/em\u003e\u003c/td\u003e\u003ctd\u003eBackslash \u003ccode class=\"literal\"\u003ex\u003c/code\u003e followed by one or two hex digits specifies the byte with that numeric code\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp\u003ePresently, \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e will never emit an octal or hex-digits backslash sequence, but it does use the other sequences listed above for those control characters.\u003c/p\u003e\u003cp\u003eAny other backslashed character that is not mentioned in the above table will be taken to represent itself. However, beware of adding backslashes unnecessarily, since that might accidentally produce a string matching the end-of-data marker (\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e) or the null string (\u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e by default). These strings will be recognized before any other backslash processing is done.\u003c/p\u003e\u003cp\u003eIt is strongly recommended that applications generating \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e data convert data newlines and carriage returns to the \u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e and \u003ccode class=\"literal\"\u003e\\r\u003c/code\u003e sequences respectively. At present it is possible to represent a data carriage return by a backslash and carriage return, and to represent a data newline by a backslash and newline. However, these representations might not be accepted in future releases. They are also highly vulnerable to corruption if the \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e file is transferred across different machines (for example, from Unix to Windows or vice versa).\u003c/p\u003e\u003cp\u003eAll backslash sequences are interpreted after encoding conversion. The bytes specified with the octal and hex-digit backslash sequences must form valid characters in the database encoding.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e will terminate each row with a Unix-style newline (\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e). Servers running on Microsoft Windows instead output carriage return/newline (\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e\u003ccode class=\"literal\"\u003e\\r\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e), but only for \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e to a server file; for consistency across platforms, \u003ccode class=\"command\"\u003eCOPY TO STDOUT\u003c/code\u003e always sends \u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e regardless of server platform. \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e can handle lines ending with newlines, carriage returns, or carriage return/newlines. To reduce the risk of error due to un-backslashed newlines or carriage returns that were meant as data, \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e will complain if the line endings in the input are not all alike.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eCSV Format\u003c/h3\u003e\u003cp\u003eThis format option is used for importing and exporting the Comma- Separated Value (\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e) file format used by many other programs, such as spreadsheets. Instead of the escaping rules used by \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e's standard text format, it produces and recognizes the common \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e escaping mechanism.\u003c/p\u003e\u003cp\u003eThe values in each record are separated by the \u003ccode class=\"literal\"\u003eDELIMITER\u003c/code\u003e character. If the value contains the delimiter character, the \u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e character, the \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e string, a carriage return, or line feed character, then the whole value is prefixed and suffixed by the \u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e character, and any occurrence within the value of a \u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e character or the \u003ccode class=\"literal\"\u003eESCAPE\u003c/code\u003e character is preceded by the escape character. You can also use \u003ccode class=\"literal\"\u003eFORCE_QUOTE\u003c/code\u003e to force quotes when outputting non-\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e values in specific columns.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format has no standard way to distinguish a \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e value from an empty string. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e's \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e handles this by quoting. A \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e is output as the \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e parameter string and is not quoted, while a non-\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e value matching the \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e parameter string is quoted. For example, with the default settings, a \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e is written as an unquoted empty string, while an empty string data value is written with double quotes (\u003ccode class=\"literal\"\u003e\"\"\u003c/code\u003e). Reading values follows similar rules. You can use \u003ccode class=\"literal\"\u003eFORCE_NOT_NULL\u003c/code\u003e to prevent \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e input comparisons for specific columns. You can also use \u003ccode class=\"literal\"\u003eFORCE_NULL\u003c/code\u003e to convert quoted null string data values to \u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eBecause backslash is not a special character in the \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format, the end-of-data marker used in text mode (\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e) is not normally treated as special when reading \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e data. An exception is that \u003cspan class=\"application\"\u003epsql\u003c/span\u003e will terminate a \u003ccode class=\"literal\"\u003eCOPY FROM STDIN\u003c/code\u003e operation (that is, reading in-line \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e data in an SQL script) at a line containing only \u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e, whether it is text or \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e mode.\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e versions before v18 always recognized unquoted \u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e as an end-of-data marker, even when reading from a separate file. For compatibility with older versions, \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e will quote \u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e when it's alone on a line, even though this is no longer necessary.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003eIn \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format, all characters are significant. A quoted value surrounded by white space, or any characters other than \u003ccode class=\"literal\"\u003eDELIMITER\u003c/code\u003e, will include those characters. This can cause errors if you import data from a system that pads \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e lines with white space out to some fixed width. If such a situation arises you might need to preprocess the \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e file to remove the trailing white space, before importing the data into \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e format will both recognize and produce \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e files with quoted values containing embedded carriage returns and line feeds. Thus the files are not strictly one line per table row like text-format files.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003eMany programs produce strange and occasionally perverse \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e files, so the file format is more a convention than a standard. Thus you might encounter some files that cannot be imported using this mechanism, and \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e might produce files that other programs cannot process.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eBinary Format\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e format option causes all data to be stored/read as binary format rather than as text. It is somewhat faster than the text and \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e formats, but a binary-format file is less portable across machine architectures and \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e versions. Also, the binary format is very data type specific; for example it will not work to output binary data from a \u003ccode class=\"type\"\u003esmallint\u003c/code\u003e column and read it into an \u003ccode class=\"type\"\u003einteger\u003c/code\u003e column, even though that would work fine in text format.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e file format consists of a file header, zero or more tuples containing the row data, and a file trailer. Headers and data are in network byte order.\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e releases before 7.4 used a different binary file format.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect3\"\u003e\u003ch4\u003eFile Header\u003c/h4\u003e\u003cp\u003eThe file header consists of 15 bytes of fixed fields, followed by a variable-length header extension area. The fixed fields are:\u003c/p\u003e\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003eSignature\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e11-byte sequence \u003ccode class=\"literal\"\u003ePGCOPY\\n\\377\\r\\n\\0\u003c/code\u003e — note that the zero byte is a required part of the signature. (The signature is designed to allow easy identification of files that have been munged by a non-8-bit-clean transfer. This signature will be changed by end-of-line-translation filters, dropped zero bytes, dropped high bits, or parity changes.)\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003eFlags field\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e32-bit integer bit mask to denote important aspects of the file format. Bits are numbered from 0 (\u003cacronym\u003eLSB\u003c/acronym\u003e) to 31 (\u003cacronym\u003eMSB\u003c/acronym\u003e). Note that this field is stored in network byte order (most significant byte first), as are all the integer fields used in the file format. Bits 16–31 are reserved to denote critical file format issues; a reader should abort if it finds an unexpected bit set in this range. Bits 0–15 are reserved to signal backwards-compatible format issues; a reader should simply ignore any unexpected bits set in this range. Currently only one flag bit is defined, and the rest must be zero:\u003c/p\u003e\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003eBit 16\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eIf 1, OIDs are included in the data; if 0, not. Oid system columns are not supported in \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e anymore, but the format still contains the indicator.\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003eHeader extension area length\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e32-bit integer, length in bytes of remainder of header, not including self. Currently, this is zero, and the first tuple follows immediately. Future changes to the format might allow additional data to be present in the header. A reader should silently skip over any header extension data it does not know what to do with.\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003cp\u003eThe header extension area is envisioned to contain a sequence of self-identifying chunks. The flags field is not intended to tell readers what is in the extension area. Specific design of header extension contents is left for a later release.\u003c/p\u003e\u003cp\u003eThis design allows for both backwards-compatible header additions (add header extension chunks, or set low-order flag bits) and non-backwards-compatible changes (set high-order flag bits to signal such changes, and add supporting data to the extension area if needed).\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect3\"\u003e\u003ch4\u003eTuples\u003c/h4\u003e\u003cp\u003eEach tuple begins with a 16-bit integer count of the number of fields in the tuple. (Presently, all tuples in a table will have the same count, but that might not always be true.) Then, repeated for each field in the tuple, there is a 32-bit length word followed by that many bytes of field data. (The length word does not include itself, and can be zero.) As a special case, -1 indicates a NULL field value. No value bytes follow in the NULL case.\u003c/p\u003e\u003cp\u003eThere is no alignment padding or any other extra data between fields.\u003c/p\u003e\u003cp\u003ePresently, all data values in a binary-format file are assumed to be in binary format (format code one). It is anticipated that a future extension might add a header field that allows per-column format codes to be specified.\u003c/p\u003e\u003cp\u003eTo determine the appropriate binary format for the actual tuple data you should consult the \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e source, in particular the \u003ccode class=\"function\"\u003e*send\u003c/code\u003e and \u003ccode class=\"function\"\u003e*recv\u003c/code\u003e functions for each column's data type (typically these functions are found in the \u003ccode class=\"filename\"\u003esrc/backend/utils/adt/\u003c/code\u003e directory of the source distribution).\u003c/p\u003e\u003cp\u003eIf OIDs are included in the file, the OID field immediately follows the field-count word. It is a normal field except that it's not included in the field-count. Note that oid system columns are not supported in current versions of \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect3\"\u003e\u003ch4\u003eFile Trailer\u003c/h4\u003e\u003cp\u003eThe file trailer consists of a 16-bit integer word containing -1. This is easily distinguished from a tuple's field-count word.\u003c/p\u003e\u003cp\u003eA reader should report an error if a field-count word is neither -1 nor the expected number of columns. This provides an extra check against somehow getting out of sync with the data.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e","key":"other","title":"File Formats"},{"html":"\u003cp\u003eThe following example copies a table to the client using the vertical bar (\u003ccode class=\"literal\"\u003e|\u003c/code\u003e) as the field delimiter:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY country TO STDOUT (DELIMITER '|');\n\u003c/pre\u003e\u003cp\u003eTo copy data from a file into the \u003ccode class=\"literal\"\u003ecountry\u003c/code\u003e table:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY country FROM '/usr1/proj/bray/sql/country_data';\n\u003c/pre\u003e\u003cp\u003eTo copy into a file just the countries whose names start with 'A':\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy';\n\u003c/pre\u003e\u003cp\u003eTo copy into a compressed file, you can pipe the output through an external compression program:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY country TO PROGRAM 'gzip \u0026gt; /usr1/proj/bray/sql/country_data.gz';\n\u003c/pre\u003e\u003cp\u003eHere is a sample of data suitable for copying into a table from \u003ccode class=\"literal\"\u003eSTDIN\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eAF      AFGHANISTAN\nAL      ALBANIA\nDZ      ALGERIA\nZM      ZAMBIA\nZW      ZIMBABWE\n\u003c/pre\u003e\u003cp\u003eNote that the white space on each line is actually a tab character.\u003c/p\u003e\u003cp\u003eThe following is the same data, output in binary format. The data is shown after filtering through the Unix utility \u003ccode class=\"command\"\u003eod -c\u003c/code\u003e. The table has three columns; the first has type \u003ccode class=\"type\"\u003echar(2)\u003c/code\u003e, the second has type \u003ccode class=\"type\"\u003etext\u003c/code\u003e, and the third has type \u003ccode class=\"type\"\u003einteger\u003c/code\u003e. All the rows have a null value in the third column.\u003c/p\u003e\u003cpre class=\"programlisting\"\u003e0000000   P   G   C   O   P   Y  \\n 377  \\r  \\n  \\0  \\0  \\0  \\0  \\0  \\0\n0000020  \\0  \\0  \\0  \\0 003  \\0  \\0  \\0 002   A   F  \\0  \\0  \\0 013   A\n0000040   F   G   H   A   N   I   S   T   A   N 377 377 377 377  \\0 003\n0000060  \\0  \\0  \\0 002   A   L  \\0  \\0  \\0 007   A   L   B   A   N   I\n0000100   A 377 377 377 377  \\0 003  \\0  \\0  \\0 002   D   Z  \\0  \\0  \\0\n0000120 007   A   L   G   E   R   I   A 377 377 377 377  \\0 003  \\0  \\0\n0000140  \\0 002   Z   M  \\0  \\0  \\0 006   Z   A   M   B   I   A 377 377\n0000160 377 377  \\0 003  \\0  \\0  \\0 002   Z   W  \\0  \\0  \\0  \\b   Z   I\n0000200   M   B   A   B   W   E 377 377 377 377 377 377\n\u003c/pre\u003e","key":"examples","title":"Examples"},{"html":"\u003cp\u003eThere is no \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e statement in the SQL standard.\u003c/p\u003e\u003cp\u003eThe following syntax was used before \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e version 9.0 and is still supported:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    FROM { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDIN }\n    [ [ WITH ]\n          [ BINARY ]\n          [ DELIMITER [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n          [ NULL [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n          [ CSV [ HEADER ]\n                [ QUOTE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ ESCAPE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ FORCE NOT NULL \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ] ] ]\n\nCOPY { \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e ) }\n    TO { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDOUT }\n    [ [ WITH ]\n          [ BINARY ]\n          [ DELIMITER [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n          [ NULL [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n          [ CSV [ HEADER ]\n                [ QUOTE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ ESCAPE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ FORCE QUOTE { \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] | * } ] ] ]\n\u003c/pre\u003e\u003cp\u003eNote that in this syntax, \u003ccode class=\"literal\"\u003eBINARY\u003c/code\u003e and \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e are treated as independent keywords, not as arguments of a \u003ccode class=\"literal\"\u003eFORMAT\u003c/code\u003e option.\u003c/p\u003e\u003cp\u003eThe following syntax was used before \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e version 7.3 and is still supported:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eCOPY [ BINARY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\n    FROM { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDIN }\n    [ [USING] DELIMITERS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n    [ WITH NULL AS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n\nCOPY [ BINARY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\n    TO { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDOUT }\n    [ [USING] DELIMITERS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n    [ WITH NULL AS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n\u003c/pre\u003e","key":"compatibility","title":"Compatibility"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/docs/18/progress-reporting.html#COPY-PROGRESS-REPORTING\" title=\"27.4.3. COPY Progress Reporting\"\u003eSection 27.4.3\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"See Also"}],"sections_same_as":"","slug":"18","synopsis_html":"COPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    FROM { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | PROGRAM '\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecommand\u003c/code\u003e\u003c/em\u003e' | STDIN }\n    [ [ WITH ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoption\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    [ WHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e ]\n\nCOPY { \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e ) }\n    TO { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | PROGRAM '\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecommand\u003c/code\u003e\u003c/em\u003e' | STDOUT }\n    [ [ WITH ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoption\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n\n\u003cspan class=\"phrase\"\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoption\u003c/code\u003e\u003c/em\u003e can be one of:\u003c/span\u003e\n\n    FORMAT \u003cem class=\"replaceable\"\u003e\u003ccode\u003eformat_name\u003c/code\u003e\u003c/em\u003e\n    FREEZE [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e ]\n    DELIMITER '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e'\n    NULL '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e'\n    DEFAULT '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edefault_string\u003c/code\u003e\u003c/em\u003e'\n    HEADER [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e | MATCH ]\n    QUOTE '\u003cem class=\"replaceable\"\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e'\n    ESCAPE '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e'\n    FORCE_QUOTE { ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) | * }\n    FORCE_NOT_NULL { ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) | * }\n    FORCE_NULL { ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) | * }\n    ON_ERROR \u003cem class=\"replaceable\"\u003e\u003ccode\u003eerror_action\u003c/code\u003e\u003c/em\u003e\n    REJECT_LIMIT \u003cem class=\"replaceable\"\u003e\u003ccode\u003emaxerror\u003c/code\u003e\u003c/em\u003e\n    ENCODING '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eencoding_name\u003c/code\u003e\u003c/em\u003e'\n    LOG_VERBOSITY \u003cem class=\"replaceable\"\u003e\u003ccode\u003everbosity\u003c/code\u003e\u003c/em\u003e","synopsis_text":"COPY table_name [ ( column_name [, ...] ) ]\nFROM { 'filename' | PROGRAM 'command' | STDIN }\n[ [ WITH ] ( option [, ...] ) ]\n[ WHERE condition ]\n\nCOPY { table_name [ ( column_name [, ...] ) ] | ( query ) }\nTO { 'filename' | PROGRAM 'command' | STDOUT }\n[ [ WITH ] ( option [, ...] ) ]\n\nwhere option can be one of:\n\nFORMAT format_name\nFREEZE [ boolean ]\nDELIMITER 'delimiter_character'\nNULL 'null_string'\nDEFAULT 'default_string'\nHEADER [ boolean | MATCH ]\nQUOTE 'quote_character'\nESCAPE 'escape_character'\nFORCE_QUOTE { ( column_name [, ...] ) | * }\nFORCE_NOT_NULL { ( column_name [, ...] ) | * }\nFORCE_NULL { ( column_name [, ...] ) | * }\nON_ERROR error_action\nREJECT_LIMIT maxerror\nENCODING 'encoding_name'\nLOG_VERBOSITY verbosity"},"ManualEvidence":{},"MeasuredEvidence":{}},"Text":{"Collection":"sql","Key":"copy","SourceDatabase":"pgweb","Version":"18","Locale":"zh-Hans","Title":"COPY","Summary":"在文件和表之间复制数据","BodyHTML":"\u003cpre\u003eCOPY table_name [ ( column_name [, ...] ) ]\nFROM { \u0026#39;filename\u0026#39; | PROGRAM \u0026#39;command\u0026#39; | STDIN }\n[ [ WITH ] ( option [, ...] ) ]\n[ WHERE condition ]\n\nCOPY { table_name [ ( column_name [, ...] ) ] | ( query ) }\nTO { \u0026#39;filename\u0026#39; | PROGRAM \u0026#39;command\u0026#39; | STDOUT }\n[ [ WITH ] ( option [, ...] ) ]\n\n其中option可以是下列之一：\n\nFORMAT format_name\nFREEZE [ boolean ]\nDELIMITER \u0026#39;delimiter_character\u0026#39;\nNULL \u0026#39;null_string\u0026#39;\nDEFAULT \u0026#39;default_string\u0026#39;\nHEADER [ boolean | MATCH ]\nQUOTE \u0026#39;quote_character\u0026#39;\nESCAPE \u0026#39;escape_character\u0026#39;\nFORCE_QUOTE { ( column_name [, ...] ) | * }\nFORCE_NOT_NULL { ( column_name [, ...] ) | * }\nFORCE_NULL { ( column_name [, ...] ) | * }\nON_ERROR error_action\nREJECT_LIMIT maxerror\nENCODING \u0026#39;encoding_name\u0026#39;\nLOG_VERBOSITY verbosity\u003c/pre\u003e\u003csection\u003e\u003ch2\u003e描述\u003c/h2\u003e\u003cp\u003e\u003ccode\u003eCOPY\u003c/code\u003e在 \u003cspan\u003ePostgreSQL\u003c/span\u003e表与标准文件系统文件之间传输数据。\u003ccode\u003eCOPY TO\u003c/code\u003e将表的内容复制\u003cspan\u003e\u003cem\u003e到\u003c/em\u003e\u003c/span\u003e文件，而\u003ccode\u003eCOPY FROM\u003c/code\u003e 则将数据\u003cspan\u003e\u003cem\u003e从\u003c/em\u003e\u003c/span\u003e文件复制到表中（追加到表中已有的数据之后）。\u003ccode\u003eCOPY TO\u003c/code\u003e也可以复制 \u003ccode\u003eSELECT\u003c/code\u003e查询的结果。\u003c/p\u003e\u003cp\u003e如果指定了列列表，\u003ccode\u003eCOPY TO\u003c/code\u003e只会将指定列中的数据复制到文件。对于\u003ccode\u003eCOPY FROM\u003c/code\u003e，文件中的每个字段会按顺序插入到指定列中。未在\u003ccode\u003eCOPY FROM\u003c/code\u003e列列表中指定的表列将接收其默认值。\u003c/p\u003e\u003cp\u003e带文件名的\u003ccode\u003eCOPY\u003c/code\u003e会指示 \u003cspan\u003ePostgreSQL\u003c/span\u003e服务器直接从文件读取或向文件写入。该文件必须可由 \u003cspan\u003ePostgreSQL\u003c/span\u003e用户（服务器运行时使用的用户 ID）访问，并且其名称必须从服务器的视角指定。当指定 \u003ccode\u003ePROGRAM\u003c/code\u003e时，服务器会执行给定的命令，并从该程序的标准输出读取，或者向该程序的标准输入写入。该命令必须从服务器的视角指定，并且必须可由\u003cspan\u003ePostgreSQL\u003c/span\u003e用户执行。指定 \u003ccode\u003eSTDIN\u003c/code\u003e或\u003ccode\u003eSTDOUT\u003c/code\u003e时，数据通过客户端与服务器之间的连接传输。\u003c/p\u003e\u003cp\u003e每个执行\u003ccode\u003eCOPY\u003c/code\u003e的后端进程都会在 \u003ccode\u003epg_stat_progress_copy\u003c/code\u003e视图中报告其进度。有关详细信息，请参见\u003ca href=\"/docs/18/progress-reporting.html#COPY-PROGRESS-REPORTING\" rel=\"nofollow\"\u003e第 27.4.3 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e默认情况下，\u003ccode\u003eCOPY\u003c/code\u003e在处理过程中遇到错误会失败。如果希望尽力而为地尝试装载整个文件，可以使用 \u003ccode\u003eON_ERROR\u003c/code\u003e子句指定其他行为。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e参数\u003c/h2\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e一个现有表的名称（可以是模式限定的）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要复制的可选列列表。如果没有指定列列表，则会复制该表除生成列之外的所有列。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e其结果将被复制的\u003ca href=\"/docs/18/sql-select.html\" title=\"SELECT\" rel=\"nofollow\"\u003e\u003ccode\u003eSELECT\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-values.html\" title=\"VALUES\" rel=\"nofollow\"\u003e\u003ccode\u003eVALUES\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-insert.html\" title=\"INSERT\" rel=\"nofollow\"\u003e\u003ccode\u003eINSERT\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-update.html\" title=\"UPDATE\" rel=\"nofollow\"\u003e\u003ccode\u003eUPDATE\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-delete.html\" title=\"DELETE\" rel=\"nofollow\"\u003e\u003ccode\u003eDELETE\u003c/code\u003e\u003c/a\u003e或 \u003ca href=\"/docs/18/sql-merge.html\" title=\"MERGE\" rel=\"nofollow\"\u003e\u003ccode\u003eMERGE\u003c/code\u003e\u003c/a\u003e命令。注意查询外层必须带圆括号。\u003c/p\u003e\u003cp\u003e对于\u003ccode\u003eINSERT\u003c/code\u003e、\u003ccode\u003eUPDATE\u003c/code\u003e、\u003ccode\u003eDELETE\u003c/code\u003e和\u003ccode\u003eMERGE\u003c/code\u003e查询，必须提供 \u003ccode\u003eRETURNING\u003c/code\u003e子句，并且目标关系不能有条件规则，也不能有 \u003ccode\u003eALSO\u003c/code\u003e规则，也不能有扩展为多个语句的 \u003ccode\u003eINSTEAD\u003c/code\u003e规则。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e输入或输出文件的路径名。输入文件名可以是绝对路径或相对路径，但输出文件名必须是绝对路径。Windows 用户可能需要使用 \u003ccode\u003eE\u0026#39;\u0026#39;\u003c/code\u003e字符串，并将路径名中的任何反斜线写成双反斜线。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003ePROGRAM\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要执行的命令。在\u003ccode\u003eCOPY FROM\u003c/code\u003e中，输入从该命令的标准输出读取；而在\u003ccode\u003eCOPY TO\u003c/code\u003e中，输出会写入该命令的标准输入。\u003c/p\u003e\u003cp\u003e注意该命令由 shell 调用，因此如果需要传递来自不可信来源的参数，必须小心剥离或转义任何可能对 shell 具有特殊含义的字符。出于安全考虑，最好使用固定的命令字符串，至少也应避免在其中包含任何用户输入。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eSTDIN\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定输入来自客户端应用。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eSTDOUT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定输出发送到客户端应用。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定所选选项是否开启。可以写\u003ccode\u003eTRUE\u003c/code\u003e、\u003ccode\u003eON\u003c/code\u003e或\u003ccode\u003e1\u003c/code\u003e来启用选项，写\u003ccode\u003eFALSE\u003c/code\u003e、\u003ccode\u003eOFF\u003c/code\u003e或\u003ccode\u003e0\u003c/code\u003e来禁用它。也可以省略\u003cem\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e值，此时假定为\u003ccode\u003eTRUE\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eFORMAT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e选择要读取或者写入的数据格式：\u003ccode\u003etext\u003c/code\u003e、\u003ccode\u003ecsv\u003c/code\u003e（逗号分隔值）或者\u003ccode\u003ebinary\u003c/code\u003e。默认是\u003ccode\u003etext\u003c/code\u003e。详见下文\u003ca href=\"/docs/18/sql-copy.html#SQL-COPY-FILE-FORMATS\" title=\"文件格式\" rel=\"nofollow\"\u003eFile Formats\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eFREEZE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e请求在复制数据时就将行冻结，就像运行 \u003ccode\u003eVACUUM FREEZE\u003c/code\u003e命令之后那样。这是为初始数据装载设计的一个性能选项。只有当被装载的表已在当前子事务中创建或截断、该事务中没有打开的游标，并且该事务没有持有更旧的快照时，行才会被冻结。目前无法在分区表或外部表上执行\u003ccode\u003eCOPY FREEZE\u003c/code\u003e。此选项仅允许在\u003ccode\u003eCOPY FROM\u003c/code\u003e中使用。\u003c/p\u003e\u003cp\u003e注意，一旦成功装载，所有其他会话都将立即能够看到这些数据。这违背了 MVCC 可见性的常规规则，使用该选项的用户应当了解这可能导致的潜在问题。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eDELIMITER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定分隔文件中每一行（记录）内各列的字符。文本格式中默认是一个制表符，而\u003ccode\u003eCSV\u003c/code\u003e格式中默认是一个逗号。这必须是一个单一的单字节字符。使用\u003ccode\u003ebinary\u003c/code\u003e格式时不允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eNULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定表示一个空值的字符串。文本格式中默认是 \u003ccode\u003e\\N\u003c/code\u003e（反斜线-N），\u003ccode\u003eCSV\u003c/code\u003e格式中默认是一个未加引用的空串。在你不想区分空值和空串的情况下，即使在文本格式中你也可能更喜欢空串。使用\u003ccode\u003ebinary\u003c/code\u003e格式时不允许这个选项。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e在使用\u003ccode\u003eCOPY FROM\u003c/code\u003e时，任何匹配此字符串的数据项都会被存储为空值，因此应确保这里使用的字符串与 \u003ccode\u003eCOPY TO\u003c/code\u003e时使用的相同。\u003c/p\u003e\u003c/div\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eDEFAULT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定表示默认值的字符串。每次在输入文件中发现该字符串时，都会使用对应列的默认值。此选项仅允许用于\u003ccode\u003eCOPY FROM\u003c/code\u003e，且不能使用\u003ccode\u003ebinary\u003c/code\u003e格式。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eHEADER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定文件包含一个标题行，其中含有文件中每一列的列名。在输出时，第一行包含表中的列名。在输入时，当此选项设置为\u003ccode\u003etrue\u003c/code\u003e（或等效的布尔值）时，第一行会被丢弃。如果此选项设置为 \u003ccode\u003eMATCH\u003c/code\u003e，则标题行中的列数和列名必须按顺序与表的实际列名匹配；否则会报错。使用\u003ccode\u003ebinary\u003c/code\u003e格式时不允许此选项。\u003ccode\u003eMATCH\u003c/code\u003e选项仅对\u003ccode\u003eCOPY FROM\u003c/code\u003e命令有效。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eQUOTE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定在对数据值加引号时使用的引用字符。默认是双引号。这必须是一个单一的单字节字符。只有使用 \u003ccode\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eESCAPE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定在与\u003ccode\u003eQUOTE\u003c/code\u003e值匹配的数据字符之前应出现的字符。默认值与\u003ccode\u003eQUOTE\u003c/code\u003e值相同（这样当引用字符出现在数据中时，就会被双写）。这必须是一个单一的单字节字符。只有使用\u003ccode\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eFORCE_QUOTE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e强制对每个指定列中的所有非\u003ccode\u003eNULL\u003c/code\u003e值使用引号。\u003ccode\u003eNULL\u003c/code\u003e输出永远不会加引号。如果指定了\u003ccode\u003e*\u003c/code\u003e，则所有列中的非\u003ccode\u003eNULL\u003c/code\u003e值都会加引号。此选项仅允许用于 \u003ccode\u003eCOPY TO\u003c/code\u003e，且只能在使用\u003ccode\u003eCSV\u003c/code\u003e格式时使用。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eFORCE_NOT_NULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e不要将指定列的值与空值串进行匹配。在空值串就是空串的默认情况下，这意味着空串将被读作长度为零的字符串而不是空值（即使它们没有被引用）。如果指定了 \u003ccode\u003e*\u003c/code\u003e，该选项会应用到所有列。只有在\u003ccode\u003eCOPY FROM\u003c/code\u003e中使用 \u003ccode\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eFORCE_NULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e将指定列的值与空值串匹配，即使它已经被加上引号；如果找到匹配，就将该值设为\u003ccode\u003eNULL\u003c/code\u003e。在空值串就是空串的默认情况下，这会把一个带引号的空串转换为\u003ccode\u003eNULL\u003c/code\u003e。如果指定了 \u003ccode\u003e*\u003c/code\u003e，该选项会应用到所有列。只有在\u003ccode\u003eCOPY FROM\u003c/code\u003e中使用 \u003ccode\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eON_ERROR\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定在将列输入值转换为其数据类型时遇到错误的处理方式。\u003cem\u003e\u003ccode\u003eerror_action\u003c/code\u003e\u003c/em\u003e为 \u003ccode\u003estop\u003c/code\u003e时表示使命令失败；而\u003ccode\u003eignore\u003c/code\u003e 表示丢弃当前输入行并继续处理下一行。默认值是\u003ccode\u003estop\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eignore\u003c/code\u003e仅适用于\u003ccode\u003eCOPY FROM\u003c/code\u003e，且 \u003ccode\u003eFORMAT\u003c/code\u003e为\u003ccode\u003etext\u003c/code\u003e或\u003ccode\u003ecsv\u003c/code\u003e的情况。\u003c/p\u003e\u003cp\u003e如果至少丢弃了一行，在\u003ccode\u003eCOPY FROM\u003c/code\u003e结束时会发出一条包含被忽略行数的\u003ccode\u003eNOTICE\u003c/code\u003e消息。当\u003ccode\u003eLOG_VERBOSITY\u003c/code\u003e 设为\u003ccode\u003everbose\u003c/code\u003e时，每丢弃一行都会发出一条 \u003ccode\u003eNOTICE\u003c/code\u003e消息，其中包含输入文件中的行号以及输入转换失败的列名。当其设为\u003ccode\u003esilent\u003c/code\u003e时，不会发出任何关于被忽略行的消息。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eREJECT_LIMIT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e当\u003ccode\u003eON_ERROR\u003c/code\u003e设置为\u003ccode\u003eignore\u003c/code\u003e时，指定将列输入值转换为其数据类型时可容忍的最大错误数。如果输入导致的错误数超过该值，即使设置了 \u003ccode\u003eON_ERROR\u003c/code\u003e=\u003ccode\u003eignore\u003c/code\u003e，\u003ccode\u003eCOPY\u003c/code\u003e命令也会失败。该子句必须与 \u003ccode\u003eON_ERROR\u003c/code\u003e=\u003ccode\u003eignore\u003c/code\u003e一起使用，并且 \u003cem\u003e\u003ccode\u003emaxerror\u003c/code\u003e\u003c/em\u003e必须是正的 \u003ccode\u003ebigint\u003c/code\u003e。若未指定，则 \u003ccode\u003eON_ERROR\u003c/code\u003e=\u003ccode\u003eignore\u003c/code\u003e允许无限个错误，也就是\u003ccode\u003eCOPY\u003c/code\u003e会跳过所有出错数据。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eENCODING\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定文件采用\u003cem\u003e\u003ccode\u003eencoding_name\u003c/code\u003e\u003c/em\u003e编码。如果省略此选项，将使用当前客户端编码。详见下文注解。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eLOG_VERBOSITY\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定\u003ccode\u003eCOPY\u003c/code\u003e命令发出消息的详细程度：\u003ccode\u003edefault\u003c/code\u003e、\u003ccode\u003everbose\u003c/code\u003e或 \u003ccode\u003esilent\u003c/code\u003e。如果指定\u003ccode\u003everbose\u003c/code\u003e，处理过程中会发出额外消息；\u003ccode\u003esilent\u003c/code\u003e会抑制 \u003ccode\u003everbose\u003c/code\u003e和默认消息。\u003c/p\u003e\u003cp\u003e目前该选项用于\u003ccode\u003eCOPY FROM\u003c/code\u003e且 \u003ccode\u003eON_ERROR\u003c/code\u003e设置为\u003ccode\u003eignore\u003c/code\u003e的场景。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eWHERE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e可选的\u003ccode\u003eWHERE\u003c/code\u003e子句的一般形式是：\u003c/p\u003e\u003cpre\u003eWHERE \u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中\u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e是任意求值结果为 \u003ccode\u003eboolean\u003c/code\u003e的表达式。任何不满足该条件的行都不会被插入到表中。如果用实际行值替换所有变量引用后该表达式返回 true，则该行满足该条件。\u003c/p\u003e\u003cp\u003e目前，\u003ccode\u003eWHERE\u003c/code\u003e表达式中不允许使用子查询和生成列，并且求值时看不到 \u003ccode\u003eCOPY\u003c/code\u003e自身所做的任何更改（当表达式包含对 \u003ccode\u003eVOLATILE\u003c/code\u003e函数的调用时，这一点很重要）。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e输出\u003c/h2\u003e\u003cp\u003e成功完成时，\u003ccode\u003eCOPY\u003c/code\u003e命令会返回形如\u003c/p\u003e\u003cpre\u003eCOPY \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e的命令标签。\u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e为复制的行数。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e只有当命令既不是\u003ccode\u003eCOPY ... TO STDOUT\u003c/code\u003e，也不是等效的 \u003cspan\u003epsql\u003c/span\u003e元命令\u003ccode\u003e\\copy ... to stdout\u003c/code\u003e时，\u003cspan\u003epsql\u003c/span\u003e才会打印这个命令标签。这是为了避免将命令标签与刚刚输出的数据混淆。\u003c/p\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e注解\u003c/h2\u003e\u003cp\u003e\u003ccode\u003eCOPY TO\u003c/code\u003e可用于普通表和已填充的物化视图。例如，\u003ccode\u003eCOPY \u003cem\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e TO\u003c/code\u003e 复制的行与 \u003ccode\u003eSELECT * FROM ONLY \u003cem\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e 相同。但它不直接支持其他关系类型，如分区表、继承子表或视图。要复制这类关系的全部行，请使用 \u003ccode\u003eCOPY (SELECT * FROM \u003cem\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e) TO\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY FROM\u003c/code\u003e可用于普通表、外部表、分区表，以及具有 \u003ccode\u003eINSTEAD OF INSERT\u003c/code\u003e触发器的视图。\u003c/p\u003e\u003cp\u003e你必须对\u003ccode\u003eCOPY TO\u003c/code\u003e读取其值的表具有 \u003ccode\u003eSELECT\u003c/code\u003e权限，并对\u003ccode\u003eCOPY FROM\u003c/code\u003e 插入其值的表具有\u003ccode\u003eINSERT\u003c/code\u003e权限。对于命令中列出的列，具有列级权限即可。\u003c/p\u003e\u003cp\u003e如果对表启用了行级安全，相关的\u003ccode\u003eSELECT\u003c/code\u003e策略将应用于 \u003ccode\u003eCOPY \u003cem\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e TO\u003c/code\u003e 语句。目前，对启用了行级安全的表不支持\u003ccode\u003eCOPY FROM\u003c/code\u003e。请改用等效的\u003ccode\u003eINSERT\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY\u003c/code\u003e命令中指定的文件由服务器而非客户端应用直接读取或写入。因此，这些文件必须位于数据库服务器所在机器上，或者可由数据库服务器访问，而不是仅由客户端访问。它们必须可由\u003cspan\u003ePostgreSQL\u003c/span\u003e用户（服务器运行时使用的用户 ID）访问，并且对该用户可读或可写。同样，使用\u003ccode\u003ePROGRAM\u003c/code\u003e指定的命令也是由服务器而非客户端应用直接执行，因而必须可由\u003cspan\u003ePostgreSQL\u003c/span\u003e用户执行。只有数据库超级用户，或被授予\u003ccode\u003epg_read_server_files\u003c/code\u003e、\u003ccode\u003epg_write_server_files\u003c/code\u003e或 \u003ccode\u003epg_execute_server_program\u003c/code\u003e之一的用户，才允许使用指定文件名或命令的\u003ccode\u003eCOPY\u003c/code\u003e，因为这允许读取或写入服务器有权访问的任意文件，或者运行服务器有权执行的程序。\u003c/p\u003e\u003cp\u003e不要将\u003ccode\u003eCOPY\u003c/code\u003e与 \u003cspan\u003epsql\u003c/span\u003e指令 \u003ccode\u003e\u003ca href=\"/docs/18/app-psql.html#APP-PSQL-META-COMMANDS-COPY\" rel=\"nofollow\"\u003e\\copy\u003c/a\u003e\u003c/code\u003e 混淆。\u003ccode\u003e\\copy\u003c/code\u003e会调用 \u003ccode\u003eCOPY FROM STDIN\u003c/code\u003e或\u003ccode\u003eCOPY TO STDOUT\u003c/code\u003e，然后在\u003cspan\u003epsql\u003c/span\u003e客户端可访问的文件中读取或存储数据。因此，使用\u003ccode\u003e\\copy\u003c/code\u003e时，文件的可访问性和访问权限取决于客户端而不是服务器。\u003c/p\u003e\u003cp\u003e建议在\u003ccode\u003eCOPY\u003c/code\u003e中使用的文件名始终指定为绝对路径。对于\u003ccode\u003eCOPY TO\u003c/code\u003e，服务器会强制这一点；但对于 \u003ccode\u003eCOPY FROM\u003c/code\u003e，你仍可选择从使用相对路径指定的文件中读取。该路径将相对于服务器进程的工作目录（通常是集簇的数据目录）而非客户端的工作目录进行解释。\u003c/p\u003e\u003cp\u003e使用\u003ccode\u003ePROGRAM\u003c/code\u003e执行命令可能会受到操作系统的访问控制机制（如 SELinux）的限制。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY FROM\u003c/code\u003e将调用目标表上的任何触发器和检查约束。但是它不会调用规则。\u003c/p\u003e\u003cp\u003e对于标识列，\u003ccode\u003eCOPY FROM\u003c/code\u003e命令总会写入输入数据中提供的列值，其行为类似于\u003ccode\u003eINSERT\u003c/code\u003e的 \u003ccode\u003eOVERRIDING SYSTEM VALUE\u003c/code\u003e选项。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY\u003c/code\u003e的输入和输出会受 \u003ccode\u003eDateStyle\u003c/code\u003e影响。为确保数据能移植到其他可能使用非默认 \u003ccode\u003eDateStyle\u003c/code\u003e设置的\u003cspan\u003ePostgreSQL\u003c/span\u003e 安装中，使用\u003ccode\u003eCOPY TO\u003c/code\u003e前应将 \u003ccode\u003eDateStyle\u003c/code\u003e设置为\u003ccode\u003eISO\u003c/code\u003e。同样也建议避免在 \u003ccode\u003eIntervalStyle\u003c/code\u003e设置为\u003ccode\u003esql_standard\u003c/code\u003e时转储数据，因为负的 interval 值可能会被采用不同 \u003ccode\u003eIntervalStyle\u003c/code\u003e设置的服务器误解。\u003c/p\u003e\u003cp\u003e即使数据会被服务器直接从一个文件读取或者写入一个文件而不通过客户端，输入数据也会被根据\u003ccode\u003eENCODING\u003c/code\u003e选项或者当前客户端编码解释，并且输出数据会被根据\u003ccode\u003eENCODING\u003c/code\u003e或者当前客户端编码进行编码。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY FROM\u003c/code\u003e在处理过程中会把输入行物理插入表中。如果命令失败，这些行会处于已删除状态；它们不可见，但仍占据磁盘空间。如果在大型复制操作后期失败，这可能造成大量磁盘空间浪费。应使用 \u003ccode\u003eVACUUM\u003c/code\u003e 回收这些浪费的空间。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eFORCE_NULL\u003c/code\u003e和\u003ccode\u003eFORCE_NOT_NULL\u003c/code\u003e可以同时用于同一列。这会把带引号的空值串转换为空值，并把不带引号的空值串转换为空串。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e文件格式\u003c/h2\u003e\u003cdiv\u003e\u003ch3\u003e文本格式\u003c/h3\u003e\u003cp\u003e在使用\u003ccode\u003etext\u003c/code\u003e格式时，读取或写入的是一个文本文件，其中表中的每一行对应文件中的一行。每行中的列由分隔符字符隔开。列值本身是由各属性数据类型的输出函数生成或可被其输入函数接受的字符串。对于为空值的列，会使用指定的空值串代替。如果输入文件中的任何一行包含的列数多于或少于预期，\u003ccode\u003eCOPY FROM\u003c/code\u003e就会报错。\u003c/p\u003e\u003cp\u003e数据结束可以表示为只包含反斜线加点号（\u003ccode\u003e\\.\u003c/code\u003e）的一行。从文件读取时，并不需要数据结束标记，因为文件结束已经足够；在该上下文中保留这一规定只是为了向后兼容。不过，\u003cspan\u003epsql\u003c/span\u003e会使用\u003ccode\u003e\\.\u003c/code\u003e终止 \u003ccode\u003eCOPY FROM STDIN\u003c/code\u003e操作（即在 SQL 脚本中读取内联 \u003ccode\u003eCOPY\u003c/code\u003e数据）。在这种情况下，需要这条规则来在脚本结束前终止操作。\u003c/p\u003e\u003cp\u003e在\u003ccode\u003eCOPY\u003c/code\u003e数据中，可以使用反斜线字符（\u003ccode\u003e\\\u003c/code\u003e）来转义那些原本可能被当作行或列分隔符的数据字符。特别是，如果下列字符作为列值的一部分出现，那么它们前面\u003cspan\u003e\u003cem\u003e必须\u003c/em\u003e\u003c/span\u003e加一个反斜线：反斜线本身、换行、回车以及当前分隔符字符。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY TO\u003c/code\u003e输出指定的空值串时不会添加任何反斜线；相反，\u003ccode\u003eCOPY FROM\u003c/code\u003e会在去除反斜线之前先将输入与空值串进行匹配。因此，像\u003ccode\u003e\\N\u003c/code\u003e这样的空值串不会与实际的数据值\u003ccode\u003e\\N\u003c/code\u003e混淆，因为后者会表示为\u003ccode\u003e\\\\N\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY FROM\u003c/code\u003e识别下列特殊的反斜线序列：\u003c/p\u003e\u003cdiv\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e序列\u003c/th\u003e\u003cth\u003e表示\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\b\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e退格 (ASCII 8)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\f\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e换页 (ASCII 12)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\n\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e新行 (ASCII 10)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\r\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e回车 (ASCII 13)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\t\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e制表 (ASCII 9)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\v\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e纵向制表 (ASCII 11)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\\u003c/code\u003e\u003cem\u003e\u003ccode\u003edigits\u003c/code\u003e\u003c/em\u003e\u003c/td\u003e\u003ctd\u003e反斜线后跟一到三个八进制数字表示该数字代码对应的字节\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e\\x\u003c/code\u003e\u003cem\u003e\u003ccode\u003edigits\u003c/code\u003e\u003c/em\u003e\u003c/td\u003e\u003ctd\u003e反斜线加\u003ccode\u003ex\u003c/code\u003e后跟一到两个十六进制数字表示该数字代码对应的字节\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp\u003e目前，\u003ccode\u003eCOPY TO\u003c/code\u003e从不会输出八进制或十六进制数字反斜线序列，但对这些控制字符确实会使用上表列出的其他序列。\u003c/p\u003e\u003cp\u003e上表中未提到的其他字符，在前面加了反斜线后仍表示该字符本身。不过，要注意不要不必要地添加反斜线，因为那可能意外地产生与数据结束标记（\u003ccode\u003e\\.\u003c/code\u003e）或空值串（默认是\u003ccode\u003e\\N\u003c/code\u003e）匹配的字符串。这些字符串会在进行任何其他反斜线处理之前先被识别出来。\u003c/p\u003e\u003cp\u003e强烈建议生成\u003ccode\u003eCOPY\u003c/code\u003e数据的应用将数据中的换行和回车分别转换为\u003ccode\u003e\\n\u003c/code\u003e和\u003ccode\u003e\\r\u003c/code\u003e序列。目前，仍然可以用反斜线加回车表示数据回车，用反斜线加换行表示数据换行。不过，未来版本可能不再接受这些表示方式。如果\u003ccode\u003eCOPY\u003c/code\u003e文件在不同机器之间传输（例如从 Unix 到 Windows，或反之），这些表示方式也非常容易被破坏。\u003c/p\u003e\u003cp\u003e所有反斜线序列都在编码转换后进行解释。用八进制和十六进制数字反斜线序列指定的字节必须在数据库编码中形成有效字符。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCOPY TO\u003c/code\u003e会用 Unix 风格的换行（\u003cspan\u003e“\u003cspan\u003e\u003ccode\u003e\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e）结束每一行。运行在 Microsoft Windows 上的服务器则会输出回车/换行（\u003cspan\u003e“\u003cspan\u003e\u003ccode\u003e\\r\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e），但这只适用于复制到服务器文件的\u003ccode\u003eCOPY\u003c/code\u003e；为保证跨平台一致性，\u003ccode\u003eCOPY TO STDOUT\u003c/code\u003e总是发送\u003cspan\u003e“\u003cspan\u003e\u003ccode\u003e\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e，与服务器平台无关。\u003ccode\u003eCOPY FROM\u003c/code\u003e能够处理以换行、回车或回车/换行结束的行。为减少本应是数据的未加反斜线新行或回车带来的风险，如果输入中的行结束符并不一致，\u003ccode\u003eCOPY FROM\u003c/code\u003e将会报错。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003eCSV 格式\u003c/h3\u003e\u003cp\u003e这种格式选项用于导入和导出许多其他程序（如电子表格）使用的逗号分隔值（\u003ccode\u003eCSV\u003c/code\u003e）文件格式。不同于 \u003cspan\u003ePostgreSQL\u003c/span\u003e标准文本格式使用的转义规则，它会生成并识别通用的\u003ccode\u003eCSV\u003c/code\u003e转义机制。\u003c/p\u003e\u003cp\u003e每条记录中的值由\u003ccode\u003eDELIMITER\u003c/code\u003e字符分隔。如果某个值包含分隔符字符、\u003ccode\u003eQUOTE\u003c/code\u003e字符、\u003ccode\u003eNULL\u003c/code\u003e字符串、回车或换行字符，那么整个值都会以前后各一个\u003ccode\u003eQUOTE\u003c/code\u003e字符包围，并且该值内每次出现\u003ccode\u003eQUOTE\u003c/code\u003e字符或\u003ccode\u003eESCAPE\u003c/code\u003e 字符之前都会加上转义字符。对于指定列中的非\u003ccode\u003eNULL\u003c/code\u003e值输出，还可以使用\u003ccode\u003eFORCE_QUOTE\u003c/code\u003e来强制加引号。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eCSV\u003c/code\u003e格式没有标准方式区分\u003ccode\u003eNULL\u003c/code\u003e值和空字符串。\u003cspan\u003ePostgreSQL\u003c/span\u003e的\u003ccode\u003eCOPY\u003c/code\u003e通过引号来处理这一区别。\u003ccode\u003eNULL\u003c/code\u003e会按照\u003ccode\u003eNULL\u003c/code\u003e参数字符串输出，且不会被加引号；而与\u003ccode\u003eNULL\u003c/code\u003e参数字符串匹配的非\u003ccode\u003eNULL\u003c/code\u003e 值会被加引号。例如，在默认设置下，\u003ccode\u003eNULL\u003c/code\u003e会写成一个未加引号的空字符串，而空字符串数据值会写成双引号包围的形式（\u003ccode\u003e\u0026#34;\u0026#34;\u003c/code\u003e）。读取值时遵循类似规则。你可以使用\u003ccode\u003eFORCE_NOT_NULL\u003c/code\u003e来阻止对指定列进行\u003ccode\u003eNULL\u003c/code\u003e输入比较。也可以使用\u003ccode\u003eFORCE_NULL\u003c/code\u003e 将带引号的空值串数据值转换为\u003ccode\u003eNULL\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e因为反斜线在\u003ccode\u003eCSV\u003c/code\u003e格式中不是特殊字符，文本模式下使用的数据结束标记（\u003ccode\u003e\\.\u003c/code\u003e）在读取\u003ccode\u003eCSV\u003c/code\u003e数据时通常不会被特殊处理。但有一个例外：\u003cspan\u003epsql\u003c/span\u003e在 \u003ccode\u003eCOPY FROM STDIN\u003c/code\u003e操作（即在 SQL 脚本中读取内联 \u003ccode\u003eCOPY\u003c/code\u003e数据）时，只要遇到仅包含\u003ccode\u003e\\.\u003c/code\u003e的一行，就会终止操作，无论当前是文本模式还是\u003ccode\u003eCSV\u003c/code\u003e模式。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e\u003cspan\u003ePostgreSQL\u003c/span\u003e在 v18 之前的版本中总是将未加引号的 \u003ccode\u003e\\.\u003c/code\u003e 识别为数据结束标记，即使是从独立文件读取时也是如此。为兼容旧版本，\u003ccode\u003eCOPY TO\u003c/code\u003e仍会在 \u003ccode\u003e\\.\u003c/code\u003e 单独占一行时为其加引号，尽管现在已非必需。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e在\u003ccode\u003eCSV\u003c/code\u003e格式中，所有字符都有意义。被空白字符或 \u003ccode\u003eDELIMITER\u003c/code\u003e之外其他字符包围的带引号值，会把这些字符也包含进值中。如果你导入的数据来自某个会用空白把\u003ccode\u003eCSV\u003c/code\u003e 行填充到固定宽度的系统，这可能导致错误。出现这种情况时，你可能需要在将数据导入\u003cspan\u003ePostgreSQL\u003c/span\u003e之前，先预处理\u003ccode\u003eCSV\u003c/code\u003e文件以移除尾随空白。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eCSV\u003c/code\u003e格式既能识别也能生成这样的\u003ccode\u003eCSV\u003c/code\u003e文件：其中带引号的值包含内嵌的回车和换行。因此，这类文件不像文本格式文件那样严格地一行对应表中的一行。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e很多程序会生成奇怪、甚至近乎反常的\u003ccode\u003eCSV\u003c/code\u003e文件，因此这种文件格式更像一种约定而非标准。因而你可能会遇到无法用这种机制导入的文件，而\u003ccode\u003eCOPY\u003c/code\u003e也可能生成其他程序无法处理的文件。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e二进制格式\u003c/h3\u003e\u003cp\u003e\u003ccode\u003ebinary\u003c/code\u003e格式选项会使所有数据以二进制格式而不是文本格式存储或读取。它比文本和\u003ccode\u003eCSV\u003c/code\u003e格式稍快一些，但二进制格式文件在不同的机器架构和\u003cspan\u003ePostgreSQL\u003c/span\u003e版本之间的可移植性较差。此外，二进制格式与数据类型高度相关。例如，不能从 \u003ccode\u003esmallint\u003c/code\u003e列输出二进制数据再读入到\u003ccode\u003einteger\u003c/code\u003e列中，尽管这种做法在文本格式下是可行的。\u003c/p\u003e\u003cp\u003e\u003ccode\u003ebinary\u003c/code\u003e文件格式由文件头、零个或多个包含行数据的元组以及一个文件尾构成。头部和数据都以网络字节序表示。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e7.4 之前的\u003cspan\u003ePostgreSQL\u003c/span\u003e版本使用一种不同的二进制文件格式。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch4\u003e文件头\u003c/h4\u003e\u003cp\u003e文件头由 19 字节的固定字段构成，后面跟着一个变长的头部扩展区。固定字段有：\u003c/p\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e签名\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e11 字节序列\u003ccode\u003ePGCOPY\\n\\377\\r\\n\\0\u003c/code\u003e — 注意，零字节是签名中必不可少的一部分。（该签名的设计目的是便于识别那些在不具备 8 位透明性的传输过程中遭到破坏的文件。行尾转换过滤器、零字节丢失、高位丢失或奇偶校验变化等情况都会改变该签名。）\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e标志字段\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e32 位整数位掩码，用以表示该文件格式的重要方面。位编号从 0（\u003cacronym\u003eLSB\u003c/acronym\u003e）到 31（\u003cacronym\u003eMSB\u003c/acronym\u003e）。注意，该字段和此文件格式中使用的所有整数字段一样，都按网络字节序存放（最高有效字节在前）。16 到 31 位保留用于表示严重的文件格式问题；如果读取程序在这个范围内发现意外置位，应该中止。0 到 15 位保留用于表示向后兼容的格式问题；读取程序应简单忽略这个范围内任何意外置位。目前只定义了一个标志位，其余位都必须为零：\u003c/p\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e位 16\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e如果为 1，则数据中包含 OID；如果为 0，则不包含。当前版本的 \u003cspan\u003ePostgreSQL\u003c/span\u003e已不再支持 oid 系统列，但该格式仍保留这个指示符。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e头部扩展区长度\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e32 位整数，表示头部剩余部分的长度（以字节计），不包括该字段本身。当前该值为零，因此其后紧接着第一个元组。未来对这种格式的更改可能允许在头部中包含额外数据。如果读取程序不知道如何处理头部扩展区数据，应静默跳过它。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003cp\u003e头部扩展区被设想为包含一系列可自我标识的块。标志字段并不用于告诉读取程序扩展区中包含哪些内容。头部扩展内容的具体设计留待后续版本决定。\u003c/p\u003e\u003cp\u003e这种设计既允许向后兼容的头部新增（增加头部扩展块，或设置低位标志位），也允许不向后兼容的更改（设置高位标志位来表明这类更改，并在需要时向扩展区增加支持数据）。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch4\u003e元组\u003c/h4\u003e\u003cp\u003e每个元组都以一个 16 位整数计数开头，用于表示该元组中的字段数。（目前，一个表中的所有元组都应有相同的计数，但这未必永远如此。）随后，对元组中的每个字段，都会有一个 32 位长度字，后跟相应字节数的字段数据。（长度字不包括其本身，且可以为零。）特殊情况下，-1 表示一个 NULL 字段值；在 NULL 情况下，后面不会跟随任何值字节。\u003c/p\u003e\u003cp\u003e字段之间没有对齐填充或任何其他额外数据。\u003c/p\u003e\u003cp\u003e当前，二进制格式文件中的所有数据值都假定为二进制格式（格式代码一）。可以预见，未来的扩展可能会增加一个允许为各列分别指定格式代码的头部字段。\u003c/p\u003e\u003cp\u003e要确定实际元组数据应采用的二进制格式，你应该参考 \u003cspan\u003ePostgreSQL\u003c/span\u003e源码，特别是各列数据类型对应的\u003ccode\u003e*send\u003c/code\u003e和\u003ccode\u003e*recv\u003c/code\u003e函数（这些函数通常可以在源码分发包的\u003ccode\u003esrc/backend/utils/adt/\u003c/code\u003e目录中找到）。\u003c/p\u003e\u003cp\u003e如果文件中包含 OID，则 OID 字段会紧跟在字段计数字之后。它是一个普通字段，不过不计入字段数。注意，当前版本的\u003cspan\u003ePostgreSQL\u003c/span\u003e 不再支持 oid 系统列。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch4\u003e文件尾\u003c/h4\u003e\u003cp\u003e文件尾由一个值为 -1 的 16 位整数构成。这很容易与元组的字段计数字区分开来。\u003c/p\u003e\u003cp\u003e如果字段计数字既不是 -1 也不是预期的列数，读取程序应报告错误。这提供了一项额外检查，以防与数据失去同步。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e示例\u003c/h2\u003e\u003cp\u003e下面的示例使用竖线（\u003ccode\u003e|\u003c/code\u003e）作为字段分隔符将一个表复制到客户端：\u003c/p\u003e\u003cpre\u003eCOPY country TO STDOUT (DELIMITER \u0026#39;|\u0026#39;);\n\u003c/pre\u003e\u003cp\u003e要将文件中的数据复制到\u003ccode\u003ecountry\u003c/code\u003e表中：\u003c/p\u003e\u003cpre\u003eCOPY country FROM \u0026#39;/usr1/proj/bray/sql/country_data\u0026#39;;\n\u003c/pre\u003e\u003cp\u003e只把名称以 \u0026#39;A\u0026#39; 开头的国家复制到一个文件中：\u003c/p\u003e\u003cpre\u003eCOPY (SELECT * FROM country WHERE country_name LIKE \u0026#39;A%\u0026#39;) TO \u0026#39;/usr1/proj/bray/sql/a_list_countries.copy\u0026#39;;\n\u003c/pre\u003e\u003cp\u003e要复制到压缩文件中，可以将输出通过管道送入外部压缩程序：\u003c/p\u003e\u003cpre\u003eCOPY country TO PROGRAM \u0026#39;gzip \u0026gt; /usr1/proj/bray/sql/country_data.gz\u0026#39;;\n\u003c/pre\u003e\u003cp\u003e下面给出适合从\u003ccode\u003eSTDIN\u003c/code\u003e复制到表中的示例数据：\u003c/p\u003e\u003cpre\u003eAF      AFGHANISTAN\nAL      ALBANIA\nDZ      ALGERIA\nZM      ZAMBIA\nZW      ZIMBABWE\n\u003c/pre\u003e\u003cp\u003e注意每一行中的空白实际上是一个制表符。\u003c/p\u003e\u003cp\u003e下面是用二进制格式输出的相同数据。该数据是用 Unix 工具 \u003ccode\u003eod -c\u003c/code\u003e过滤后显示的。该表具有三列，第一列类型是\u003ccode\u003echar(2)\u003c/code\u003e，第二列类型是\u003ccode\u003etext\u003c/code\u003e，第三列类型是\u003ccode\u003einteger\u003c/code\u003e。所有行在第三列都是空值。\u003c/p\u003e\u003cpre\u003e0000000   P   G   C   O   P   Y  \\n 377  \\r  \\n  \\0  \\0  \\0  \\0  \\0  \\0\n0000020  \\0  \\0  \\0  \\0 003  \\0  \\0  \\0 002   A   F  \\0  \\0  \\0 013   A\n0000040   F   G   H   A   N   I   S   T   A   N 377 377 377 377  \\0 003\n0000060  \\0  \\0  \\0 002   A   L  \\0  \\0  \\0 007   A   L   B   A   N   I\n0000100   A 377 377 377 377  \\0 003  \\0  \\0  \\0 002   D   Z  \\0  \\0  \\0\n0000120 007   A   L   G   E   R   I   A 377 377 377 377  \\0 003  \\0  \\0\n0000140  \\0 002   Z   M  \\0  \\0  \\0 006   Z   A   M   B   I   A 377 377\n0000160 377 377  \\0 003  \\0  \\0  \\0 002   Z   W  \\0  \\0  \\0  \\b   Z   I\n0000200   M   B   A   B   W   E 377 377 377 377 377 377\n\u003c/pre\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e兼容性\u003c/h2\u003e\u003cp\u003eSQL 标准中没有\u003ccode\u003eCOPY\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e下列语法在\u003cspan\u003ePostgreSQL\u003c/span\u003e 9.0 之前的版本中使用，现仍受支持：\u003c/p\u003e\u003cpre\u003eCOPY \u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    FROM { \u0026#39;\u003cem\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u0026#39; | STDIN }\n    [ [ WITH ]\n          [ BINARY ]\n          [ DELIMITER [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n          [ NULL [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n          [ CSV [ HEADER ]\n                [ QUOTE [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n                [ ESCAPE [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n                [ FORCE NOT NULL \u003cem\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ] ] ]\n\nCOPY { \u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] | ( \u003cem\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e ) }\n    TO { \u0026#39;\u003cem\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u0026#39; | STDOUT }\n    [ [ WITH ]\n          [ BINARY ]\n          [ DELIMITER [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n          [ NULL [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n          [ CSV [ HEADER ]\n                [ QUOTE [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n                [ ESCAPE [ AS ] \u0026#39;\u003cem\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n                [ FORCE QUOTE { \u003cem\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] | * } ] ] ]\n\u003c/pre\u003e\u003cp\u003e注意在这种语法中，\u003ccode\u003eBINARY\u003c/code\u003e和\u003ccode\u003eCSV\u003c/code\u003e被视为独立的关键字，而不是\u003ccode\u003eFORMAT\u003c/code\u003e选项的参数。\u003c/p\u003e\u003cp\u003e下列语法在\u003cspan\u003ePostgreSQL\u003c/span\u003e 7.3 之前的版本中使用，现仍受支持：\u003c/p\u003e\u003cpre\u003eCOPY [ BINARY ] \u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\n    FROM { \u0026#39;\u003cem\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u0026#39; | STDIN }\n    [ [USING] DELIMITERS \u0026#39;\u003cem\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n    [ WITH NULL AS \u0026#39;\u003cem\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n\nCOPY [ BINARY ] \u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\n    TO { \u0026#39;\u003cem\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u0026#39; | STDOUT }\n    [ [USING] DELIMITERS \u0026#39;\u003cem\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n    [ WITH NULL AS \u0026#39;\u003cem\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e\u0026#39; ]\n\u003c/pre\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e另见\u003c/h2\u003e\u003cspan\u003e\u003ca href=\"/docs/18/progress-reporting.html#COPY-PROGRESS-REPORTING\" rel=\"nofollow\"\u003e第 27.4.3 节\u003c/a\u003e\u003c/span\u003e\u003c/section\u003e","SourceRevision":"1b5ca64c","ContentHash":"4683b23cadfe369af656f85e7bccbe3f7677f330bb505acfff3971e04b29831c","Payload":{"purpose_zh":"在文件和表之间复制数据","sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e在 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e表与标准文件系统文件之间传输数据。\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e将表的内容复制\u003cspan class=\"emphasis\"\u003e\u003cem\u003e到\u003c/em\u003e\u003c/span\u003e文件，而\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e 则将数据\u003cspan class=\"emphasis\"\u003e\u003cem\u003e从\u003c/em\u003e\u003c/span\u003e文件复制到表中（追加到表中已有的数据之后）。\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e也可以复制 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e查询的结果。\u003c/p\u003e\u003cp\u003e如果指定了列列表，\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e只会将指定列中的数据复制到文件。对于\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e，文件中的每个字段会按顺序插入到指定列中。未在\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e列列表中指定的表列将接收其默认值。\u003c/p\u003e\u003cp\u003e带文件名的\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e会指示 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e服务器直接从文件读取或向文件写入。该文件必须可由 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e用户（服务器运行时使用的用户 ID）访问，并且其名称必须从服务器的视角指定。当指定 \u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e时，服务器会执行给定的命令，并从该程序的标准输出读取，或者向该程序的标准输入写入。该命令必须从服务器的视角指定，并且必须可由\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e用户执行。指定 \u003ccode class=\"literal\"\u003eSTDIN\u003c/code\u003e或\u003ccode class=\"literal\"\u003eSTDOUT\u003c/code\u003e时，数据通过客户端与服务器之间的连接传输。\u003c/p\u003e\u003cp\u003e每个执行\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e的后端进程都会在 \u003ccode class=\"structname\"\u003epg_stat_progress_copy\u003c/code\u003e视图中报告其进度。有关详细信息，请参见\u003ca href=\"/docs/18/progress-reporting.html#COPY-PROGRESS-REPORTING\" title=\"27.4.3. COPY 进度报告\"\u003e第 27.4.3 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e默认情况下，\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e在处理过程中遇到错误会失败。如果希望尽力而为地尝试装载整个文件，可以使用 \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e子句指定其他行为。\u003c/p\u003e","key":"description","title":"描述"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e一个现有表的名称（可以是模式限定的）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要复制的可选列列表。如果没有指定列列表，则会复制该表除生成列之外的所有列。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e其结果将被复制的\u003ca href=\"/docs/18/sql-select.html\" title=\"SELECT\"\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-values.html\" title=\"VALUES\"\u003e\u003ccode class=\"command\"\u003eVALUES\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-insert.html\" title=\"INSERT\"\u003e\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-update.html\" title=\"UPDATE\"\u003e\u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e\u003c/a\u003e、\u003ca href=\"/docs/18/sql-delete.html\" title=\"DELETE\"\u003e\u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e\u003c/a\u003e或 \u003ca href=\"/docs/18/sql-merge.html\" title=\"MERGE\"\u003e\u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e\u003c/a\u003e命令。注意查询外层必须带圆括号。\u003c/p\u003e\u003cp\u003e对于\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e、\u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e、\u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e和\u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e查询，必须提供 \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e子句，并且目标关系不能有条件规则，也不能有 \u003ccode class=\"literal\"\u003eALSO\u003c/code\u003e规则，也不能有扩展为多个语句的 \u003ccode class=\"literal\"\u003eINSTEAD\u003c/code\u003e规则。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e输入或输出文件的路径名。输入文件名可以是绝对路径或相对路径，但输出文件名必须是绝对路径。Windows 用户可能需要使用 \u003ccode class=\"literal\"\u003eE''\u003c/code\u003e字符串，并将路径名中的任何反斜线写成双反斜线。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要执行的命令。在\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e中，输入从该命令的标准输出读取；而在\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e中，输出会写入该命令的标准输入。\u003c/p\u003e\u003cp\u003e注意该命令由 shell 调用，因此如果需要传递来自不可信来源的参数，必须小心剥离或转义任何可能对 shell 具有特殊含义的字符。出于安全考虑，最好使用固定的命令字符串，至少也应避免在其中包含任何用户输入。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTDIN\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定输入来自客户端应用。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTDOUT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定输出发送到客户端应用。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定所选选项是否开启。可以写\u003ccode class=\"literal\"\u003eTRUE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eON\u003c/code\u003e或\u003ccode class=\"literal\"\u003e1\u003c/code\u003e来启用选项，写\u003ccode class=\"literal\"\u003eFALSE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eOFF\u003c/code\u003e或\u003ccode class=\"literal\"\u003e0\u003c/code\u003e来禁用它。也可以省略\u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e值，此时假定为\u003ccode class=\"literal\"\u003eTRUE\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORMAT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e选择要读取或者写入的数据格式：\u003ccode class=\"literal\"\u003etext\u003c/code\u003e、\u003ccode class=\"literal\"\u003ecsv\u003c/code\u003e（逗号分隔值）或者\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e。默认是\u003ccode class=\"literal\"\u003etext\u003c/code\u003e。详见下文\u003ca href=\"/docs/18/sql-copy.html#SQL-COPY-FILE-FORMATS\" title=\"文件格式\"\u003eFile Formats\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFREEZE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e请求在复制数据时就将行冻结，就像运行 \u003ccode class=\"command\"\u003eVACUUM FREEZE\u003c/code\u003e命令之后那样。这是为初始数据装载设计的一个性能选项。只有当被装载的表已在当前子事务中创建或截断、该事务中没有打开的游标，并且该事务没有持有更旧的快照时，行才会被冻结。目前无法在分区表或外部表上执行\u003ccode class=\"command\"\u003eCOPY FREEZE\u003c/code\u003e。此选项仅允许在\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e中使用。\u003c/p\u003e\u003cp\u003e注意，一旦成功装载，所有其他会话都将立即能够看到这些数据。这违背了 MVCC 可见性的常规规则，使用该选项的用户应当了解这可能导致的潜在问题。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eDELIMITER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定分隔文件中每一行（记录）内各列的字符。文本格式中默认是一个制表符，而\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式中默认是一个逗号。这必须是一个单一的单字节字符。使用\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e格式时不允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定表示一个空值的字符串。文本格式中默认是 \u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e（反斜线-N），\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式中默认是一个未加引用的空串。在你不想区分空值和空串的情况下，即使在文本格式中你也可能更喜欢空串。使用\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e格式时不允许这个选项。\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e在使用\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e时，任何匹配此字符串的数据项都会被存储为空值，因此应确保这里使用的字符串与 \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e时使用的相同。\u003c/p\u003e\u003c/div\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eDEFAULT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定表示默认值的字符串。每次在输入文件中发现该字符串时，都会使用对应列的默认值。此选项仅允许用于\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e，且不能使用\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e格式。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eHEADER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定文件包含一个标题行，其中含有文件中每一列的列名。在输出时，第一行包含表中的列名。在输入时，当此选项设置为\u003ccode class=\"literal\"\u003etrue\u003c/code\u003e（或等效的布尔值）时，第一行会被丢弃。如果此选项设置为 \u003ccode class=\"literal\"\u003eMATCH\u003c/code\u003e，则标题行中的列数和列名必须按顺序与表的实际列名匹配；否则会报错。使用\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e格式时不允许此选项。\u003ccode class=\"literal\"\u003eMATCH\u003c/code\u003e选项仅对\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e命令有效。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定在对数据值加引号时使用的引用字符。默认是双引号。这必须是一个单一的单字节字符。只有使用 \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eESCAPE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定在与\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e值匹配的数据字符之前应出现的字符。默认值与\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e值相同（这样当引用字符出现在数据中时，就会被双写）。这必须是一个单一的单字节字符。只有使用\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORCE_QUOTE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e强制对每个指定列中的所有非\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e值使用引号。\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e输出永远不会加引号。如果指定了\u003ccode class=\"literal\"\u003e*\u003c/code\u003e，则所有列中的非\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e值都会加引号。此选项仅允许用于 \u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e，且只能在使用\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式时使用。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORCE_NOT_NULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e不要将指定列的值与空值串进行匹配。在空值串就是空串的默认情况下，这意味着空串将被读作长度为零的字符串而不是空值（即使它们没有被引用）。如果指定了 \u003ccode class=\"literal\"\u003e*\u003c/code\u003e，该选项会应用到所有列。只有在\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e中使用 \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eFORCE_NULL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e将指定列的值与空值串匹配，即使它已经被加上引号；如果找到匹配，就将该值设为\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e。在空值串就是空串的默认情况下，这会把一个带引号的空串转换为\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e。如果指定了 \u003ccode class=\"literal\"\u003e*\u003c/code\u003e，该选项会应用到所有列。只有在\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e中使用 \u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式时才允许这个选项。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定在将列输入值转换为其数据类型时遇到错误的处理方式。\u003cem class=\"replaceable\"\u003e\u003ccode\u003eerror_action\u003c/code\u003e\u003c/em\u003e为 \u003ccode class=\"literal\"\u003estop\u003c/code\u003e时表示使命令失败；而\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e 表示丢弃当前输入行并继续处理下一行。默认值是\u003ccode class=\"literal\"\u003estop\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e仅适用于\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e，且 \u003ccode class=\"literal\"\u003eFORMAT\u003c/code\u003e为\u003ccode class=\"literal\"\u003etext\u003c/code\u003e或\u003ccode class=\"literal\"\u003ecsv\u003c/code\u003e的情况。\u003c/p\u003e\u003cp\u003e如果至少丢弃了一行，在\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e结束时会发出一条包含被忽略行数的\u003ccode class=\"literal\"\u003eNOTICE\u003c/code\u003e消息。当\u003ccode class=\"literal\"\u003eLOG_VERBOSITY\u003c/code\u003e 设为\u003ccode class=\"literal\"\u003everbose\u003c/code\u003e时，每丢弃一行都会发出一条 \u003ccode class=\"literal\"\u003eNOTICE\u003c/code\u003e消息，其中包含输入文件中的行号以及输入转换失败的列名。当其设为\u003ccode class=\"literal\"\u003esilent\u003c/code\u003e时，不会发出任何关于被忽略行的消息。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eREJECT_LIMIT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e当\u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e设置为\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e时，指定将列输入值转换为其数据类型时可容忍的最大错误数。如果输入导致的错误数超过该值，即使设置了 \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e=\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e，\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e命令也会失败。该子句必须与 \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e=\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e一起使用，并且 \u003cem class=\"replaceable\"\u003e\u003ccode\u003emaxerror\u003c/code\u003e\u003c/em\u003e必须是正的 \u003ccode class=\"type\"\u003ebigint\u003c/code\u003e。若未指定，则 \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e=\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e允许无限个错误，也就是\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e会跳过所有出错数据。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eENCODING\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定文件采用\u003cem class=\"replaceable\"\u003e\u003ccode\u003eencoding_name\u003c/code\u003e\u003c/em\u003e编码。如果省略此选项，将使用当前客户端编码。详见下文注解。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eLOG_VERBOSITY\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e指定\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e命令发出消息的详细程度：\u003ccode class=\"literal\"\u003edefault\u003c/code\u003e、\u003ccode class=\"literal\"\u003everbose\u003c/code\u003e或 \u003ccode class=\"literal\"\u003esilent\u003c/code\u003e。如果指定\u003ccode class=\"literal\"\u003everbose\u003c/code\u003e，处理过程中会发出额外消息；\u003ccode class=\"literal\"\u003esilent\u003c/code\u003e会抑制 \u003ccode class=\"literal\"\u003everbose\u003c/code\u003e和默认消息。\u003c/p\u003e\u003cp\u003e目前该选项用于\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e且 \u003ccode class=\"literal\"\u003eON_ERROR\u003c/code\u003e设置为\u003ccode class=\"literal\"\u003eignore\u003c/code\u003e的场景。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句的一般形式是：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eWHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中\u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e是任意求值结果为 \u003ccode class=\"type\"\u003eboolean\u003c/code\u003e的表达式。任何不满足该条件的行都不会被插入到表中。如果用实际行值替换所有变量引用后该表达式返回 true，则该行满足该条件。\u003c/p\u003e\u003cp\u003e目前，\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e表达式中不允许使用子查询和生成列，并且求值时看不到 \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e自身所做的任何更改（当表达式包含对 \u003ccode class=\"literal\"\u003eVOLATILE\u003c/code\u003e函数的调用时，这一点很重要）。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"参数"},{"html":"\u003cp\u003e成功完成时，\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e命令会返回形如\u003c/p\u003e\u003cpre class=\"screen\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e的命令标签。\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e为复制的行数。\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e只有当命令既不是\u003ccode class=\"literal\"\u003eCOPY ... TO STDOUT\u003c/code\u003e，也不是等效的 \u003cspan class=\"application\"\u003epsql\u003c/span\u003e元命令\u003ccode class=\"literal\"\u003e\\copy ... to stdout\u003c/code\u003e时，\u003cspan class=\"application\"\u003epsql\u003c/span\u003e才会打印这个命令标签。这是为了避免将命令标签与刚刚输出的数据混淆。\u003c/p\u003e\u003c/div\u003e","key":"outputs","title":"输出"},{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e可用于普通表和已填充的物化视图。例如，\u003ccode class=\"literal\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e TO\u003c/code\u003e 复制的行与 \u003ccode class=\"literal\"\u003eSELECT * FROM ONLY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e 相同。但它不直接支持其他关系类型，如分区表、继承子表或视图。要复制这类关系的全部行，请使用 \u003ccode class=\"literal\"\u003eCOPY (SELECT * FROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e) TO\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e可用于普通表、外部表、分区表，以及具有 \u003ccode class=\"literal\"\u003eINSTEAD OF INSERT\u003c/code\u003e触发器的视图。\u003c/p\u003e\u003cp\u003e你必须对\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e读取其值的表具有 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e权限，并对\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e 插入其值的表具有\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e权限。对于命令中列出的列，具有列级权限即可。\u003c/p\u003e\u003cp\u003e如果对表启用了行级安全，相关的\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e策略将应用于 \u003ccode class=\"literal\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/em\u003e TO\u003c/code\u003e 语句。目前，对启用了行级安全的表不支持\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e。请改用等效的\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e命令中指定的文件由服务器而非客户端应用直接读取或写入。因此，这些文件必须位于数据库服务器所在机器上，或者可由数据库服务器访问，而不是仅由客户端访问。它们必须可由\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e用户（服务器运行时使用的用户 ID）访问，并且对该用户可读或可写。同样，使用\u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e指定的命令也是由服务器而非客户端应用直接执行，因而必须可由\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e用户执行。只有数据库超级用户，或被授予\u003ccode class=\"literal\"\u003epg_read_server_files\u003c/code\u003e、\u003ccode class=\"literal\"\u003epg_write_server_files\u003c/code\u003e或 \u003ccode class=\"literal\"\u003epg_execute_server_program\u003c/code\u003e之一的用户，才允许使用指定文件名或命令的\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e，因为这允许读取或写入服务器有权访问的任意文件，或者运行服务器有权执行的程序。\u003c/p\u003e\u003cp\u003e不要将\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e与 \u003cspan class=\"application\"\u003epsql\u003c/span\u003e指令 \u003ccode class=\"command\"\u003e\u003ca href=\"/docs/18/app-psql.html#APP-PSQL-META-COMMANDS-COPY\"\u003e\\copy\u003c/a\u003e\u003c/code\u003e 混淆。\u003ccode class=\"command\"\u003e\\copy\u003c/code\u003e会调用 \u003ccode class=\"command\"\u003eCOPY FROM STDIN\u003c/code\u003e或\u003ccode class=\"command\"\u003eCOPY TO STDOUT\u003c/code\u003e，然后在\u003cspan class=\"application\"\u003epsql\u003c/span\u003e客户端可访问的文件中读取或存储数据。因此，使用\u003ccode class=\"command\"\u003e\\copy\u003c/code\u003e时，文件的可访问性和访问权限取决于客户端而不是服务器。\u003c/p\u003e\u003cp\u003e建议在\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e中使用的文件名始终指定为绝对路径。对于\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e，服务器会强制这一点；但对于 \u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e，你仍可选择从使用相对路径指定的文件中读取。该路径将相对于服务器进程的工作目录（通常是集簇的数据目录）而非客户端的工作目录进行解释。\u003c/p\u003e\u003cp\u003e使用\u003ccode class=\"literal\"\u003ePROGRAM\u003c/code\u003e执行命令可能会受到操作系统的访问控制机制（如 SELinux）的限制。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e将调用目标表上的任何触发器和检查约束。但是它不会调用规则。\u003c/p\u003e\u003cp\u003e对于标识列，\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e命令总会写入输入数据中提供的列值，其行为类似于\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e的 \u003ccode class=\"literal\"\u003eOVERRIDING SYSTEM VALUE\u003c/code\u003e选项。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e的输入和输出会受 \u003ccode class=\"varname\"\u003eDateStyle\u003c/code\u003e影响。为确保数据能移植到其他可能使用非默认 \u003ccode class=\"varname\"\u003eDateStyle\u003c/code\u003e设置的\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 安装中，使用\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e前应将 \u003ccode class=\"varname\"\u003eDateStyle\u003c/code\u003e设置为\u003ccode class=\"literal\"\u003eISO\u003c/code\u003e。同样也建议避免在 \u003ccode class=\"varname\"\u003eIntervalStyle\u003c/code\u003e设置为\u003ccode class=\"literal\"\u003esql_standard\u003c/code\u003e时转储数据，因为负的 interval 值可能会被采用不同 \u003ccode class=\"varname\"\u003eIntervalStyle\u003c/code\u003e设置的服务器误解。\u003c/p\u003e\u003cp\u003e即使数据会被服务器直接从一个文件读取或者写入一个文件而不通过客户端，输入数据也会被根据\u003ccode class=\"literal\"\u003eENCODING\u003c/code\u003e选项或者当前客户端编码解释，并且输出数据会被根据\u003ccode class=\"literal\"\u003eENCODING\u003c/code\u003e或者当前客户端编码进行编码。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e在处理过程中会把输入行物理插入表中。如果命令失败，这些行会处于已删除状态；它们不可见，但仍占据磁盘空间。如果在大型复制操作后期失败，这可能造成大量磁盘空间浪费。应使用 \u003ccode class=\"command\"\u003eVACUUM\u003c/code\u003e 回收这些浪费的空间。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFORCE_NULL\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFORCE_NOT_NULL\u003c/code\u003e可以同时用于同一列。这会把带引号的空值串转换为空值，并把不带引号的空值串转换为空串。\u003c/p\u003e","key":"notes","title":"注解"},{"html":"\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e文本格式\u003c/h3\u003e\u003cp\u003e在使用\u003ccode class=\"literal\"\u003etext\u003c/code\u003e格式时，读取或写入的是一个文本文件，其中表中的每一行对应文件中的一行。每行中的列由分隔符字符隔开。列值本身是由各属性数据类型的输出函数生成或可被其输入函数接受的字符串。对于为空值的列，会使用指定的空值串代替。如果输入文件中的任何一行包含的列数多于或少于预期，\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e就会报错。\u003c/p\u003e\u003cp\u003e数据结束可以表示为只包含反斜线加点号（\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e）的一行。从文件读取时，并不需要数据结束标记，因为文件结束已经足够；在该上下文中保留这一规定只是为了向后兼容。不过，\u003cspan class=\"application\"\u003epsql\u003c/span\u003e会使用\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e终止 \u003ccode class=\"literal\"\u003eCOPY FROM STDIN\u003c/code\u003e操作（即在 SQL 脚本中读取内联 \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e数据）。在这种情况下，需要这条规则来在脚本结束前终止操作。\u003c/p\u003e\u003cp\u003e在\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e数据中，可以使用反斜线字符（\u003ccode class=\"literal\"\u003e\\\u003c/code\u003e）来转义那些原本可能被当作行或列分隔符的数据字符。特别是，如果下列字符作为列值的一部分出现，那么它们前面\u003cspan class=\"emphasis\"\u003e\u003cem\u003e必须\u003c/em\u003e\u003c/span\u003e加一个反斜线：反斜线本身、换行、回车以及当前分隔符字符。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e输出指定的空值串时不会添加任何反斜线；相反，\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e会在去除反斜线之前先将输入与空值串进行匹配。因此，像\u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e这样的空值串不会与实际的数据值\u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e混淆，因为后者会表示为\u003ccode class=\"literal\"\u003e\\\\N\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e识别下列特殊的反斜线序列：\u003c/p\u003e\u003cdiv class=\"informaltable\"\u003e\u003ctable class=\"informaltable\"\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e序列\u003c/th\u003e\u003cth\u003e表示\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\b\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e退格 (ASCII 8)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\f\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e换页 (ASCII 12)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e新行 (ASCII 10)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\r\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e回车 (ASCII 13)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\t\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e制表 (ASCII 9)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\v\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e纵向制表 (ASCII 11)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\\u003c/code\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003edigits\u003c/code\u003e\u003c/em\u003e\u003c/td\u003e\u003ctd\u003e反斜线后跟一到三个八进制数字表示该数字代码对应的字节\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode class=\"literal\"\u003e\\x\u003c/code\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003edigits\u003c/code\u003e\u003c/em\u003e\u003c/td\u003e\u003ctd\u003e反斜线加\u003ccode class=\"literal\"\u003ex\u003c/code\u003e后跟一到两个十六进制数字表示该数字代码对应的字节\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp\u003e目前，\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e从不会输出八进制或十六进制数字反斜线序列，但对这些控制字符确实会使用上表列出的其他序列。\u003c/p\u003e\u003cp\u003e上表中未提到的其他字符，在前面加了反斜线后仍表示该字符本身。不过，要注意不要不必要地添加反斜线，因为那可能意外地产生与数据结束标记（\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e）或空值串（默认是\u003ccode class=\"literal\"\u003e\\N\u003c/code\u003e）匹配的字符串。这些字符串会在进行任何其他反斜线处理之前先被识别出来。\u003c/p\u003e\u003cp\u003e强烈建议生成\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e数据的应用将数据中的换行和回车分别转换为\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e和\u003ccode class=\"literal\"\u003e\\r\u003c/code\u003e序列。目前，仍然可以用反斜线加回车表示数据回车，用反斜线加换行表示数据换行。不过，未来版本可能不再接受这些表示方式。如果\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e文件在不同机器之间传输（例如从 Unix 到 Windows，或反之），这些表示方式也非常容易被破坏。\u003c/p\u003e\u003cp\u003e所有反斜线序列都在编码转换后进行解释。用八进制和十六进制数字反斜线序列指定的字节必须在数据库编码中形成有效字符。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e会用 Unix 风格的换行（\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e）结束每一行。运行在 Microsoft Windows 上的服务器则会输出回车/换行（\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e\u003ccode class=\"literal\"\u003e\\r\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e），但这只适用于复制到服务器文件的\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e；为保证跨平台一致性，\u003ccode class=\"command\"\u003eCOPY TO STDOUT\u003c/code\u003e总是发送\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e\u003ccode class=\"literal\"\u003e\\n\u003c/code\u003e\u003c/span\u003e”\u003c/span\u003e，与服务器平台无关。\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e能够处理以换行、回车或回车/换行结束的行。为减少本应是数据的未加反斜线新行或回车带来的风险，如果输入中的行结束符并不一致，\u003ccode class=\"command\"\u003eCOPY FROM\u003c/code\u003e将会报错。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eCSV 格式\u003c/h3\u003e\u003cp\u003e这种格式选项用于导入和导出许多其他程序（如电子表格）使用的逗号分隔值（\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e）文件格式。不同于 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e标准文本格式使用的转义规则，它会生成并识别通用的\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e转义机制。\u003c/p\u003e\u003cp\u003e每条记录中的值由\u003ccode class=\"literal\"\u003eDELIMITER\u003c/code\u003e字符分隔。如果某个值包含分隔符字符、\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e字符、\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e字符串、回车或换行字符，那么整个值都会以前后各一个\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e字符包围，并且该值内每次出现\u003ccode class=\"literal\"\u003eQUOTE\u003c/code\u003e字符或\u003ccode class=\"literal\"\u003eESCAPE\u003c/code\u003e 字符之前都会加上转义字符。对于指定列中的非\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e值输出，还可以使用\u003ccode class=\"literal\"\u003eFORCE_QUOTE\u003c/code\u003e来强制加引号。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式没有标准方式区分\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e值和空字符串。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e的\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e通过引号来处理这一区别。\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e会按照\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e参数字符串输出，且不会被加引号；而与\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e参数字符串匹配的非\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e 值会被加引号。例如，在默认设置下，\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e会写成一个未加引号的空字符串，而空字符串数据值会写成双引号包围的形式（\u003ccode class=\"literal\"\u003e\"\"\u003c/code\u003e）。读取值时遵循类似规则。你可以使用\u003ccode class=\"literal\"\u003eFORCE_NOT_NULL\u003c/code\u003e来阻止对指定列进行\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e输入比较。也可以使用\u003ccode class=\"literal\"\u003eFORCE_NULL\u003c/code\u003e 将带引号的空值串数据值转换为\u003ccode class=\"literal\"\u003eNULL\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e因为反斜线在\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式中不是特殊字符，文本模式下使用的数据结束标记（\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e）在读取\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e数据时通常不会被特殊处理。但有一个例外：\u003cspan class=\"application\"\u003epsql\u003c/span\u003e在 \u003ccode class=\"literal\"\u003eCOPY FROM STDIN\u003c/code\u003e操作（即在 SQL 脚本中读取内联 \u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e数据）时，只要遇到仅包含\u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e的一行，就会终止操作，无论当前是文本模式还是\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e模式。\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e在 v18 之前的版本中总是将未加引号的 \u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e 识别为数据结束标记，即使是从独立文件读取时也是如此。为兼容旧版本，\u003ccode class=\"command\"\u003eCOPY TO\u003c/code\u003e仍会在 \u003ccode class=\"literal\"\u003e\\.\u003c/code\u003e 单独占一行时为其加引号，尽管现在已非必需。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e在\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式中，所有字符都有意义。被空白字符或 \u003ccode class=\"literal\"\u003eDELIMITER\u003c/code\u003e之外其他字符包围的带引号值，会把这些字符也包含进值中。如果你导入的数据来自某个会用空白把\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e 行填充到固定宽度的系统，这可能导致错误。出现这种情况时，你可能需要在将数据导入\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e之前，先预处理\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e文件以移除尾随空白。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式既能识别也能生成这样的\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e文件：其中带引号的值包含内嵌的回车和换行。因此，这类文件不像文本格式文件那样严格地一行对应表中的一行。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e很多程序会生成奇怪、甚至近乎反常的\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e文件，因此这种文件格式更像一种约定而非标准。因而你可能会遇到无法用这种机制导入的文件，而\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e也可能生成其他程序无法处理的文件。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e二进制格式\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e格式选项会使所有数据以二进制格式而不是文本格式存储或读取。它比文本和\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e格式稍快一些，但二进制格式文件在不同的机器架构和\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e版本之间的可移植性较差。此外，二进制格式与数据类型高度相关。例如，不能从 \u003ccode class=\"type\"\u003esmallint\u003c/code\u003e列输出二进制数据再读入到\u003ccode class=\"type\"\u003einteger\u003c/code\u003e列中，尽管这种做法在文本格式下是可行的。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003ebinary\u003c/code\u003e文件格式由文件头、零个或多个包含行数据的元组以及一个文件尾构成。头部和数据都以网络字节序表示。\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e7.4 之前的\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e版本使用一种不同的二进制文件格式。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect3\"\u003e\u003ch4\u003e文件头\u003c/h4\u003e\u003cp\u003e文件头由 19 字节的固定字段构成，后面跟着一个变长的头部扩展区。固定字段有：\u003c/p\u003e\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e签名\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e11 字节序列\u003ccode class=\"literal\"\u003ePGCOPY\\n\\377\\r\\n\\0\u003c/code\u003e — 注意，零字节是签名中必不可少的一部分。（该签名的设计目的是便于识别那些在不具备 8 位透明性的传输过程中遭到破坏的文件。行尾转换过滤器、零字节丢失、高位丢失或奇偶校验变化等情况都会改变该签名。）\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e标志字段\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e32 位整数位掩码，用以表示该文件格式的重要方面。位编号从 0（\u003cacronym\u003eLSB\u003c/acronym\u003e）到 31（\u003cacronym\u003eMSB\u003c/acronym\u003e）。注意，该字段和此文件格式中使用的所有整数字段一样，都按网络字节序存放（最高有效字节在前）。16 到 31 位保留用于表示严重的文件格式问题；如果读取程序在这个范围内发现意外置位，应该中止。0 到 15 位保留用于表示向后兼容的格式问题；读取程序应简单忽略这个范围内任何意外置位。目前只定义了一个标志位，其余位都必须为零：\u003c/p\u003e\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e位 16\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e如果为 1，则数据中包含 OID；如果为 0，则不包含。当前版本的 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e已不再支持 oid 系统列，但该格式仍保留这个指示符。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e头部扩展区长度\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e32 位整数，表示头部剩余部分的长度（以字节计），不包括该字段本身。当前该值为零，因此其后紧接着第一个元组。未来对这种格式的更改可能允许在头部中包含额外数据。如果读取程序不知道如何处理头部扩展区数据，应静默跳过它。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003cp\u003e头部扩展区被设想为包含一系列可自我标识的块。标志字段并不用于告诉读取程序扩展区中包含哪些内容。头部扩展内容的具体设计留待后续版本决定。\u003c/p\u003e\u003cp\u003e这种设计既允许向后兼容的头部新增（增加头部扩展块，或设置低位标志位），也允许不向后兼容的更改（设置高位标志位来表明这类更改，并在需要时向扩展区增加支持数据）。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect3\"\u003e\u003ch4\u003e元组\u003c/h4\u003e\u003cp\u003e每个元组都以一个 16 位整数计数开头，用于表示该元组中的字段数。（目前，一个表中的所有元组都应有相同的计数，但这未必永远如此。）随后，对元组中的每个字段，都会有一个 32 位长度字，后跟相应字节数的字段数据。（长度字不包括其本身，且可以为零。）特殊情况下，-1 表示一个 NULL 字段值；在 NULL 情况下，后面不会跟随任何值字节。\u003c/p\u003e\u003cp\u003e字段之间没有对齐填充或任何其他额外数据。\u003c/p\u003e\u003cp\u003e当前，二进制格式文件中的所有数据值都假定为二进制格式（格式代码一）。可以预见，未来的扩展可能会增加一个允许为各列分别指定格式代码的头部字段。\u003c/p\u003e\u003cp\u003e要确定实际元组数据应采用的二进制格式，你应该参考 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e源码，特别是各列数据类型对应的\u003ccode class=\"function\"\u003e*send\u003c/code\u003e和\u003ccode class=\"function\"\u003e*recv\u003c/code\u003e函数（这些函数通常可以在源码分发包的\u003ccode class=\"filename\"\u003esrc/backend/utils/adt/\u003c/code\u003e目录中找到）。\u003c/p\u003e\u003cp\u003e如果文件中包含 OID，则 OID 字段会紧跟在字段计数字之后。它是一个普通字段，不过不计入字段数。注意，当前版本的\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 不再支持 oid 系统列。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect3\"\u003e\u003ch4\u003e文件尾\u003c/h4\u003e\u003cp\u003e文件尾由一个值为 -1 的 16 位整数构成。这很容易与元组的字段计数字区分开来。\u003c/p\u003e\u003cp\u003e如果字段计数字既不是 -1 也不是预期的列数，读取程序应报告错误。这提供了一项额外检查，以防与数据失去同步。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e","key":"other","title":"文件格式"},{"html":"\u003cp\u003e下面的示例使用竖线（\u003ccode class=\"literal\"\u003e|\u003c/code\u003e）作为字段分隔符将一个表复制到客户端：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY country TO STDOUT (DELIMITER '|');\n\u003c/pre\u003e\u003cp\u003e要将文件中的数据复制到\u003ccode class=\"literal\"\u003ecountry\u003c/code\u003e表中：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY country FROM '/usr1/proj/bray/sql/country_data';\n\u003c/pre\u003e\u003cp\u003e只把名称以 'A' 开头的国家复制到一个文件中：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy';\n\u003c/pre\u003e\u003cp\u003e要复制到压缩文件中，可以将输出通过管道送入外部压缩程序：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCOPY country TO PROGRAM 'gzip \u0026gt; /usr1/proj/bray/sql/country_data.gz';\n\u003c/pre\u003e\u003cp\u003e下面给出适合从\u003ccode class=\"literal\"\u003eSTDIN\u003c/code\u003e复制到表中的示例数据：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eAF      AFGHANISTAN\nAL      ALBANIA\nDZ      ALGERIA\nZM      ZAMBIA\nZW      ZIMBABWE\n\u003c/pre\u003e\u003cp\u003e注意每一行中的空白实际上是一个制表符。\u003c/p\u003e\u003cp\u003e下面是用二进制格式输出的相同数据。该数据是用 Unix 工具 \u003ccode class=\"command\"\u003eod -c\u003c/code\u003e过滤后显示的。该表具有三列，第一列类型是\u003ccode class=\"type\"\u003echar(2)\u003c/code\u003e，第二列类型是\u003ccode class=\"type\"\u003etext\u003c/code\u003e，第三列类型是\u003ccode class=\"type\"\u003einteger\u003c/code\u003e。所有行在第三列都是空值。\u003c/p\u003e\u003cpre class=\"programlisting\"\u003e0000000   P   G   C   O   P   Y  \\n 377  \\r  \\n  \\0  \\0  \\0  \\0  \\0  \\0\n0000020  \\0  \\0  \\0  \\0 003  \\0  \\0  \\0 002   A   F  \\0  \\0  \\0 013   A\n0000040   F   G   H   A   N   I   S   T   A   N 377 377 377 377  \\0 003\n0000060  \\0  \\0  \\0 002   A   L  \\0  \\0  \\0 007   A   L   B   A   N   I\n0000100   A 377 377 377 377  \\0 003  \\0  \\0  \\0 002   D   Z  \\0  \\0  \\0\n0000120 007   A   L   G   E   R   I   A 377 377 377 377  \\0 003  \\0  \\0\n0000140  \\0 002   Z   M  \\0  \\0  \\0 006   Z   A   M   B   I   A 377 377\n0000160 377 377  \\0 003  \\0  \\0  \\0 002   Z   W  \\0  \\0  \\0  \\b   Z   I\n0000200   M   B   A   B   W   E 377 377 377 377 377 377\n\u003c/pre\u003e","key":"examples","title":"示例"},{"html":"\u003cp\u003eSQL 标准中没有\u003ccode class=\"command\"\u003eCOPY\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e下列语法在\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 9.0 之前的版本中使用，现仍受支持：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eCOPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    FROM { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDIN }\n    [ [ WITH ]\n          [ BINARY ]\n          [ DELIMITER [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n          [ NULL [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n          [ CSV [ HEADER ]\n                [ QUOTE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ ESCAPE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ FORCE NOT NULL \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ] ] ]\n\nCOPY { \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e ) }\n    TO { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDOUT }\n    [ [ WITH ]\n          [ BINARY ]\n          [ DELIMITER [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n          [ NULL [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n          [ CSV [ HEADER ]\n                [ QUOTE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ ESCAPE [ AS ] '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e' ]\n                [ FORCE QUOTE { \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] | * } ] ] ]\n\u003c/pre\u003e\u003cp\u003e注意在这种语法中，\u003ccode class=\"literal\"\u003eBINARY\u003c/code\u003e和\u003ccode class=\"literal\"\u003eCSV\u003c/code\u003e被视为独立的关键字，而不是\u003ccode class=\"literal\"\u003eFORMAT\u003c/code\u003e选项的参数。\u003c/p\u003e\u003cp\u003e下列语法在\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 7.3 之前的版本中使用，现仍受支持：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eCOPY [ BINARY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\n    FROM { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDIN }\n    [ [USING] DELIMITERS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n    [ WITH NULL AS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n\nCOPY [ BINARY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\n    TO { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | STDOUT }\n    [ [USING] DELIMITERS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e' ]\n    [ WITH NULL AS '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e' ]\n\u003c/pre\u003e","key":"compatibility","title":"兼容性"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/docs/18/progress-reporting.html#COPY-PROGRESS-REPORTING\" title=\"27.4.3. COPY 进度报告\"\u003e第 27.4.3 节\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"另见"}],"sections_same_as":"","synopsis_html":"COPY \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    FROM { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | PROGRAM '\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecommand\u003c/code\u003e\u003c/em\u003e' | STDIN }\n    [ [ WITH ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoption\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n    [ WHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e ]\n\nCOPY { \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003equery\u003c/code\u003e\u003c/em\u003e ) }\n    TO { '\u003cem class=\"replaceable\"\u003e\u003ccode\u003efilename\u003c/code\u003e\u003c/em\u003e' | PROGRAM '\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecommand\u003c/code\u003e\u003c/em\u003e' | STDOUT }\n    [ [ WITH ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoption\u003c/code\u003e\u003c/em\u003e [, ...] ) ]\n\n\u003cspan class=\"phrase\"\u003e其中\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoption\u003c/code\u003e\u003c/em\u003e可以是下列之一：\u003c/span\u003e\n\n    FORMAT \u003cem class=\"replaceable\"\u003e\u003ccode\u003eformat_name\u003c/code\u003e\u003c/em\u003e\n    FREEZE [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e ]\n    DELIMITER '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edelimiter_character\u003c/code\u003e\u003c/em\u003e'\n    NULL '\u003cem class=\"replaceable\"\u003e\u003ccode\u003enull_string\u003c/code\u003e\u003c/em\u003e'\n    DEFAULT '\u003cem class=\"replaceable\"\u003e\u003ccode\u003edefault_string\u003c/code\u003e\u003c/em\u003e'\n    HEADER [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eboolean\u003c/code\u003e\u003c/em\u003e | MATCH ]\n    QUOTE '\u003cem class=\"replaceable\"\u003e\u003ccode\u003equote_character\u003c/code\u003e\u003c/em\u003e'\n    ESCAPE '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eescape_character\u003c/code\u003e\u003c/em\u003e'\n    FORCE_QUOTE { ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) | * }\n    FORCE_NOT_NULL { ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) | * }\n    FORCE_NULL { ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) | * }\n    ON_ERROR \u003cem class=\"replaceable\"\u003e\u003ccode\u003eerror_action\u003c/code\u003e\u003c/em\u003e\n    REJECT_LIMIT \u003cem class=\"replaceable\"\u003e\u003ccode\u003emaxerror\u003c/code\u003e\u003c/em\u003e\n    ENCODING '\u003cem class=\"replaceable\"\u003e\u003ccode\u003eencoding_name\u003c/code\u003e\u003c/em\u003e'\n    LOG_VERBOSITY \u003cem class=\"replaceable\"\u003e\u003ccode\u003everbosity\u003c/code\u003e\u003c/em\u003e","synopsis_text":"COPY table_name [ ( column_name [, ...] ) ]\nFROM { 'filename' | PROGRAM 'command' | STDIN }\n[ [ WITH ] ( option [, ...] ) ]\n[ WHERE condition ]\n\nCOPY { table_name [ ( column_name [, ...] ) ] | ( query ) }\nTO { 'filename' | PROGRAM 'command' | STDOUT }\n[ [ WITH ] ( option [, ...] ) ]\n\n其中option可以是下列之一：\n\nFORMAT format_name\nFREEZE [ boolean ]\nDELIMITER 'delimiter_character'\nNULL 'null_string'\nDEFAULT 'default_string'\nHEADER [ boolean | MATCH ]\nQUOTE 'quote_character'\nESCAPE 'escape_character'\nFORCE_QUOTE { ( column_name [, ...] ) | * }\nFORCE_NOT_NULL { ( column_name [, ...] ) | * }\nFORCE_NULL { ( column_name [, ...] ) | * }\nON_ERROR error_action\nREJECT_LIMIT maxerror\nENCODING 'encoding_name'\nLOG_VERBOSITY verbosity"}},"RequestedLocale":"zh-Hans","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20","6.4","6.5","7.0","7.1","7.2","7.3","7.4","8.0","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
