.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "COPY" "" "2003-08-02" "SQL - 言語" "SQL コマンド"
.SH NAME
COPY \- ファイルとテーブルの間でのデータのコピー
.SH SYNOPSIS
.sp
.nf
COPY \fItable\fR [ ( \fIcolumn\fR [, ...] ) ]
FROM { '\fIfilename\fR' | \fIstdin\fR }
    [ [ WITH ]
          [ BINARY ] 
          [ OIDS ]
          [ DELIMITER [ AS ] '\fIdelimiter\fR' ]

          [ NULL [ AS ] '\fInull string\fR' ] ]
COPY \fItable\fR [ ( \fIcolumn\fR [, ...] ) ]
    TO { '\fIfilename\fR' | \fIstdout\fR }
    [ [ WITH ]
          [ BINARY ] 
          [ OIDS ]
          [ DELIMITER [ AS ] '\fIdelimiter\fR' ]
          [ NULL [ AS ] '\fInull string\fR' ] ]
  
.sp
.fi
.SS "入力"
.PP
.TP
\fB\fItable\fB\fR
既存のテーブルの名前です (スキーマ修飾の可能性もあり)。
.TP
\fB\fIcolumn\fB\fR
コピーする列のリストです(オプション)。 列のリストが指定されていない場合は、すべての列が使用されます。
.TP
\fB\fIfilename\fB\fR
入出力ファイルの Unix 絶対パス名です。
.TP
\fB\fIstdin\fB\fR
入力がクライアントアプリケーションからのものであることを指定します。
.TP
\fB\fIstdout\fB\fR
出力がクライアントアプリケーションへのものであることを指定します。
.TP
\fBBINARY\fR
フィールドのフォーマットをすべてのデータをテキストではなくバイナリで読み書きするように設定します。 バイナリモードで \fBDELIMITER\fR あるいは \fBNULL\fR を指定することはできません。
.TP
\fBOIDS\fR
それぞれの行に対する内部的なオブジェクトID（OID）をコピーすることを指定します。
.TP
\fB\fIdelimiter\fB\fR
ファイルの各行（ライン）のフィールドを区切る文字を指定します。
.TP
\fB\fInull string\fB\fR
NULL 値を表す文字列です。デフォルトでは ``\\N''（バックスラッシュ N）です。しかし、場合によっては、空の文字列の方がよいかもしれません。
.sp
.RS
.B "Note:"
コピーをして読み込む際、この文字列と一致するデータ要素は NULL 値として格納されます。 したがって、そのときには、コピーを行ったときに使用した同じ文字列を使用したかどうか確認してください。
.RE
.sp
.PP
.SS "出力"
.PP
.TP
\fBCOPY\fR
コピーは正常に終了しました。
.TP
\fBERROR:\fIreason\fB\fR
エラーメッセージ内に表示された理由(\fIreason\fR) によってコピーは失敗しました。
.PP
.SH "説明"
.PP
\fBCOPY\fRコマンドは、PostgreSQL のテーブルと標準のファイルシステムのファイル間でデータを移動します。 \fBCOPY TO\fR コマンドはテーブルのすべての内容をファイル\fBに\fRコピーします。 また、\fBCOPY FROM\fR コマンドは、ファイル\fBから\fRテーブルへとデータをコピーします (このとき、すでにテーブルにあるデータにコピー内容を追加します）。
.PP
列のリストが指定されている場合、\fBCOPY\fR では、指定された列のデータとファイルの間でのみコピーが行われます。 列リストに入っていない列がテーブル内にある場合、\fBCOPY FROM\fR は、それらの列にデフォルトの値を挿入します。
.PP
ファイル名付きの \fBCOPY\fR コマンドは、PostgreSQL のバックエンドに対して直接ファイルへの読み書きをするように伝えます。そのファイルは必ずバックエンドからアクセスでき、またファイル名はバックエンドからみたように指定されなければなりません。\fIstdin\fR や \fIstdout\fR が指定された場合、データはクライアントのフロントエンドからバックエンドに流れます。
.sp
.RS
.B "Tip:"
\fBCOPY\fR は \fBpsql\fR の \fB\\copy\fRとは異なるものであることに注意してください。\fB\\copy\fR は \fBCOPY FROM stdin\fR や \fBCOPY TO stdout\fR を呼び出し、\fBpsql\fR クライアントから接続できるファイルにデータの書き込み/読み込みを行います。したがって、\fB\\copy\fR コマンドが使用された場合には、ファイルへのアクセスとアクセス権限は、バックエンドではなく、クライアント側に依存します。
.RE
.sp
.SS "注釈"
.PP
\fBCOPY\fR は通常のテーブルに対して使用することができます。 ビューに対しては使用することができません。
.PP
BINARY キーワードはすべてのデータをテキストではなく、バイナリオブジェクトとして書き込み/読み込みするように指定します。通常の COPY コマンドより多少速く動作しますが、バイナリコピーしたファイルを異なるマシンアーキテクチャで使用することはできません。
.PP
デフォルトではテキストコピーはフィールドの区切り文字としてタブ（"\\t"）を使用します。 フィールドの区切り文字は \fBDELIMITER\fR というキーワードを用いて、別の任意の1文字に変更することができます。 区切り文字にたまたま一致するデータフィールド中の文字はバックスラッシュで囲まれます。
.PP
\fBCOPY TO\fR コマンドによって値が読み込まれるテーブルに関して、\fIselect 権限\fRを持っている必要があります。 また、\fBCOPY FROM\fR コマンドによって値が挿入されるテーブルに対しても \fIinsert 権限\fRが必要です。それに加え、バックエンドは \fBCOPY\fR によって読み書きされるファイルに適切な Unix の権限が与えられている必要があります。
.PP
\fBCOPY FROM\fR は、宛先テーブル上で任意のトリガーとチェック制約を呼び出しますが、ルールは呼び出しません。
.PP
\fBCOPY\fR では、最初のエラーで処理を停止させます。 これは、\fBCOPY TO\fR コマンドを実行している際には何ら問題はありませんが、\fBCOPY FROM\fR の場合は、対象となるリレーションは始めのほうの行を受け取り済みです。これらの行は見えませんし、アクセスすることもできませんが、ディスク領域を占有します。大きなコピー処理に何度も失敗した場合には、無視できないほど無駄なディスク領域が増えてしまいます。この無駄な領域を取り戻すために、\fBVACUUM\fR を行う必要があります。
.PP
\fBCOPY\fR コマンドで指名されたファイルはクライアントアプリケーションではなく、バックエンドが直接読み込み/書き込みを行います。したがって、それらはデータベースサーバ上に存在するか、または、クライアントではなくデータベースサーバからアクセス可能である必要があります。また、クライアントではなく \fBPostgreSQL\fR ユーザ（サーバを実行しているユーザID）で読み書きができる必要もあります。バックエンドがアクセス権限を持つ全てのファイルへの読み込み、書き込みを可能にするため、\fBCOPY\fR でファイルを指名するのは、データベースのスーパーユーザのみに許可されています。
.sp
.RS
.B "Tip:"
\fBpsql\fR の \fB\\copy\fR はクライアントの権限で、クライアントのマシンにてファイルの読み書きを行います。 したがって、スーパーユーザの権限は必要ありません。
.RE
.sp
.PP
\fBCOPY\fR で指定されるファイル名を常に絶対パスで記述することをお勧めします。\fBCOPY TO\fR コマンドの場合ではバックエンドによって強制的にそうなりますが、\fBCOPY FROM\fR コマンドでは相対パスによって指定されたファイルを読み込むことも可能となっています。そのパスは、クライアントの作業ディレクトリではなく、バックエンドの作業ディレクトリ（\fI$PGDATA\fR の下のどこか）から相対的なディレクトリとして解釈されます。
.SH "ファイル形式"
.SS "テキスト形式"
.PP
\fBCOPY\fRを BINARY オプションなしで使用した場合、読み書きされるファイルはテーブルの 1 つの行を 1 行で表したテキストファイルとなります。行内の列(属性)は区切り文字で区切られます。属性値自体はその属性のデータ型の出力関数で生成された、または、その入力関数で受け付け可能な文字列です。指定されたヌル値文字列は、属性が NULL の場所で使用されます。 入力ファイルの行にある列数が予期されていたよりも多かったり少なかったりすると、\fBCOPY FROM\fR はエラーを出します。
.PP
OIDS が指定された場合、OID はユーザデータの列よりも前の、最初の列として読み書きされます (OID が OID を持たないテーブルに対して指定された場合はエラーが発生します)。
.PP
データの終了は、バックスラッシュ-ピリオド(\\.) から構成される 1 行で表されます。ファイルの終了によって、完全に同じ機能を提供することができますので、データ終了マークは、Unix ファイルから読み込む際には不要です。 しかし、クライアントアプリケーションへの、または、からのコピーの場合は、終了マークを与えることは必要です。
.PP
バックスラッシュ文字 (\\) は \fBCOPY\fR 対象データ内で、行や列の区切り文字と判定されてしまう可能性があるデータ文字列をクォートすることに使用することができます。特に、以下の文字が属性値の一部となっている場合は \fB必ず\fR バックスラッシュを前に付けなければなりません。バックスラッシュ自体、改行、使用する区切り文字
.PP
以下の特別なバックスラッシュから始まる文字の並びは、\fBCOPY FROM\fR によって解釈されます。
文字の並び表現\\bバックスペース (ASCII 8)\\f改ページ (ASCII 12)\\n改行 (ASCII 10)\\r復帰 (ASCII 13)\\tタブ (ASCII 9)\\v垂直タブ (ASCII 11)\\\fI数字\fRバックスラッシュに続き、1 から 3 個の 8 進数で表す数字によって、そのコード番号が示す文字を指定します。
現在、\fBCOPY TO\fR は 8 進数数字のバックスラッシュ並びを出力することはありませんが、上記一覧に存在しない制御文字には、これを使用します。
.PP
N またはピリオド (.) というデータ文字の前には、バックスラッシュを決して付けないで下さい。この組み合わせは、それぞれ、ヌル文字とデータ終了マークのデフォルトと間違って解釈されてしまいます。上で示したバックスラッシュ文字以外の文字はそのまま解釈されます。
.PP
COPY データを生成するアプリケーションは、データ内の改行と復帰をそれぞれ、\\n と \\r に変換することを強く推奨されています。現在(PostgreSQL 7.2 とそれ以前のバージョン)のところ、特殊な引用方法を使用しなくともデータ内の復帰を表すことも、バックスラッシュと改行でデータ内の改行を表すことも可能です。しかし、こういった表現は今後のリリースにてデフォルトでは受け付けられなくなります。
.PP
すべての行の終わりには Unix 形式の改行文字（"\\n"）であることに注意してください。現在の \fBCOPY FROM\fRでは、MS-DOS や Mac 形式の改行が含まれているファイルに対しては、期待どおりの動作を行いません。今後のリリースで変更する予定です。
.SS "バイナリ形式"
.PP
\fBCOPY BINARY\fRで使用されるファイル形式は \fBPostgreSQL\fR v7.1で、変更されました。 新しい形式はファイルヘッダ、0 以上のタプル、ファイルトレーラで構成されています。
.SS "ファイルヘッダ"
.PP
ファイルヘッダは 24 バイトの固定フィールドで構成され、その後に可変長の拡張ヘッダがあります。固定フィールドは下記のとおりです。
.TP
\fBシグネチャ\fR
12バイトのシーケンスPGBCOPY\\n\\377\\r\\n\\0です。null(\\0)はシグネチャで必ず必要であることに注意してください（シグネチャはきれいに 8 ビットで転送されなかったファイルを容易に識別できるように設計されています。このシグネチャは改行変換のフィルター、nullの削除、上位ビット落ち、パリティの変更などによって変更されます）。
.TP
\fB整数レイアウトフィールド（Integer layout field）\fR
ソースのバイト並びにおける int32 の定数 0x01020304。不正なバイト並びが順が検出された場合、潜在的に読み込み先は引き続くフィールドのバイトをひっくり返すことができるようになります。
.TP
\fBフラグフィールド（Flags field）\fR
ファイル形式の重要部分を示す int32 ビットマスク。ビットは0（LSB）から31（MSB）までの番号が付けられます。 このフィールドが、全ての後続の整数フィールドのエンディアンを表す、ソースのエンディアン性として格納されることに注意して下さい。ビットの 16-31 は重要なファイル形式に関連することを示すために予約されています。 読み込み先はこの範囲に予期していないビットの列を発見した際には、そのファイルを破棄する必要があります。ビット 0〜ビット 15 は順序の後方互換性のあるファイル形式であるかの合図を行うために予約されています。 読み込み先はこの範囲に予期していないビットの列を発見した際には、無視しなくてはなりません。現在では、1つのフラグビットのみが定義されて、他はすべて0としなければなりません。
.RS
.TP
\fBBit 16\fR
もし 1 ならば OID がダンプに含まれます。 0 の場合には含まれません。
.RE
.PP
.TP
\fB拡張ヘッダ領域長（Header extension area length）\fR
それ自身を含まない、ヘッダの残余の int32 のバイト長。初期のバージョンでは、これは0で、そのすぐ後に最初のタプルが続きます。今後の形式の変更では、ヘッダ内に表す情報の追加があるかもしれません。読み込み先は、どのような対処を行えばいいのかがわからないヘッダに関しては、ヘッダを飛ばす必要があります。
.PP
.PP
拡張ヘッダ領域は自己確認のチャンクのシーケンスを保持するために考えられています。フラグフィールドは読み込み先に拡張領域の内容を知らせるものではありません。特定の拡張ヘッダ内容の設計は後のリリースのために残してあります。
.PP
このデザインは、後方互換性のあるヘッダーの追加（拡張ヘッダチャンクの追加、や下位フラグビットの設定）と後方互換性のない変更（変更を合図するための高位フラグビットの設定や必要に応じた拡張領域へのサポート情報追加）に有効です。
.SS "タプル"
.PP
すべてのタプルはタプル内の int16 でのフィールド数から始まります（現時点では、テーブル内のすべてのタプルは同一のフィールド数を持つようになっていますが、常にそうであるとは限りません）。 ですから、タプル中のそれぞれのフィールドで繰り返されて、フィールドデータの前に int16 の \fBtyplen\fR が付随します。 \fBtyplen\fR フィールドは以下のように解釈されます。
.TP
\fBゼロ\fR
フィールドが NULL で、後続するデータはありません。
.TP
\fB> 0\fR
フィールドは固定長のデータ型で、\fBtyplen\fR の後にちょうど N バイトのデータがあります。
.TP
\fB-1\fR
フィールドは可変長データ型で、次の 4 バイトは可変長ヘッダです。 このヘッダにそれ自身も含めた全長が含まれます。
.TP
\fB< -1\fR
将来のために予約しています。
.PP
.PP
NULL ではないフィールドに対して、読み込み先は目的列の \fBtyplen\fR が期待された \fBtyplen\fR と一致することを確認することができます。これは単純ですが、データが期待していたものであるかどうかの確認に便利です。
.PP
フィールド間では位置揃えのためのパディングや、その他の追加的データはありません。また、形式でデータ型が参照渡しであるか値渡しであるかの判断を行わないことにも注意してください。 これら両方の規定は故意のもので、ファイルの移植性を向上させる働きがあるかもしれません（しかし、エンディアン性と浮動少数形式の問題などから、マシン間のファイルの移動はまだ問題があります）。
.PP
OID がダンプに含まれている場合は、OID のフィールドはフィールドカウントの直後に位置します。これは、他のフィールドと何ら違いはありませんが、フィールドカウントにはカウントされません。 特別に \fBtyplen\fR を持ちます。 これにより 4 バイトと 8 バイトの OID に対してとりたて負担をかけずに処理を行うことやそれが望ましいと判断された場合に OID を NULL として表示させることもできます。
.SS "ファイルトレーラ"
.PP
ファイルトレーラは、-1を含んだ、int16 の情報単位で構成されます。 これはタプルのフィールドカウントを使用することによって容易に見分けることができます。
.PP
読み込み先は、フィールドカウントが-1である、または予期されていた列数とは異なる場合にはその報告を行ってください。これは、データの同期ずれに対する追加確認を提供します。
.SH "使用方法"
.PP
下記の例では、フィールドの区別文字として縦棒（「|」）を使用し、テーブルを標準出力に出します。
.sp
.nf
COPY country TO \fIstdout\fR WITH DELIMITER '|';  
.sp
.fi
.PP
下記のコマンドは、Unix ファイルからデータをテーブル country にコピーします。
.sp
.nf
COPY country FROM '/usr1/proj/bray/sql/country_data';
  
.sp
.fi
.PP
下記の例は \fIstdin\fR からテーブルにコピーするときの有効なデータを示しています（したがって、最終行に終端を表す並びがあります）。
.sp
.nf
AF      AFGHANISTAN
AL      ALBANIA
DZ      ALGERIA
ZM      ZAMBIA
ZW      ZIMBABWE
\\.
  
.sp
.fi
.PP
各行の空白は実際にはタブであることに注意してください。
.PP
以下は、Linux/i586 マシンでのバイナリ形式による同じデータの出力です。Unix のユーティリティ \fBod -c\fR コマンドでフィルタを行った後のデータを記述しています。テーブルには 3 つのフィールドがあります。 1 つ目のフィールドは \fBchar(2)\fR 型、2 つ目のフィールドは \fBtext\fR 型、3 つ目のフィールドは \fBinteger\fR です。すべての行は 3 つ目のフィールドに NULL 値を持っています。
.sp
.nf
0000000   P   G   B   C   O   P   Y  \\n 377  \\r  \\n  \\0 004 003 002 001
0000020  \\0  \\0  \\0  \\0  \\0  \\0  \\0  \\0 003  \\0 377 377 006  \\0  \\0  \\0
0000040   A   F 377 377 017  \\0  \\0  \\0   A   F   G   H   A   N   I   S
0000060   T   A   N  \\0  \\0 003  \\0 377 377 006  \\0  \\0  \\0   A   L 377
0000100 377  \\v  \\0  \\0  \\0   A   L   B   A   N   I   A  \\0  \\0 003  \\0
0000120 377 377 006  \\0  \\0  \\0   D   Z 377 377  \\v  \\0  \\0  \\0   A   L
0000140   G   E   R   I   A  \\0  \\0 003  \\0 377 377 006  \\0  \\0  \\0   Z
0000160   M 377 377  \\n  \\0  \\0  \\0   Z   A   M   B   I   A  \\0  \\0 003
0000200  \\0 377 377 006  \\0  \\0  \\0   Z   W 377 377  \\f  \\0  \\0  \\0   Z
0000220   I   M   B   A   B   W   E  \\0  \\0 377 377
  
.sp
.fi
.SH "互換性"
.SS "SQL92"
.PP
SQL92には\fBCOPY\fR文はありません。
.PP
以下の構文は、7．3 より前のアプリケーションに使われていたものですが、現在でもサポートされています。
.sp
.nf
    COPY [ BINARY ] \fItable\fR [ WITH OIDS ]
        FROM { '\fIfilename\fR' | \fIstdin\fR }
        [ [USING] DELIMITERS '\fIdelimiter\fR' ]
        [ WITH NULL AS '\fInull string\fR' ]
    COPY [ BINARY ] \fItable\fR [ WITH OIDS ]
        TO { '\fIfilename\fR' | \fIstdout\fR }
        [ [USING] DELIMITERS '\fIdelimiter\fR' ]
        [ WITH NULL AS '\fInull string\fR' ]
    
.sp
.fi
