COPY - ファイルとテーブル間でデータをコピー

SYNOPSIS

 

COPYのテーブル名 [( [、...])] 
    { 'FROM ファイル名 ' | STDIN} 
    [[WITH 
          [BINARY] 
          [OIDS] 
          [DELIMITER [AS] ' デリミタ '] 
          [NULL [AS] ' 空文字列 '] 

COPYのテーブル名 [( [、...])] 
    { 'にファイル名 ' | STDOUT} 
    [[WITH 
          [BINARY] 
          [OIDS] 
          [DELIMITER [AS] ' デリミタ '] 
          [NULL [AS] ' 空文字列']]

説明説明

COPY PostgreSQLのテーブルと標準のファイルシステムの間では、データを交換します。データテーブルを一つの文書からコピーされ(すでに存在する追加データへのコンテンツのテーブル)から、テーブルのすべての内容をファイルにコピーされTO COPY、およびCOPY。


 あなたは、フィールドのリストを宣言した場合、COPYはファイルのみとテーブルの間で宣言されたフィールド内のデータをコピーします。表がないフィールドのリストには、任意のフィールドを持っている場合は、その時からCOPYことは、これらのフィールドのデフォルト値を挿入します。


 直接ファイルからデータを読み書きPostgreSQLサーバを示すファイル名でコピーします。ファイル名を宣言した場合は、ファイルサーバが表示されている必要があり、ファイル名は、サーバーの観点で指定する必要があります。声明は、STDINやSTDOUT、フロントエンドを接続することにより、クライアントとサーバー間のデータの流れである場合。

パラメータパラメータ

テーブル名

 既存のテーブルの名前です(スキーマ修飾名)。
カラム

 オプションのフィールドリストをコピーします。ノー列リスト場合は、すべてのフィールドが使用されます。
ファイル名

 入力または出力ファイルの絶対パス名。
STDIN

 その入力は、クライアントアプリケーションから来ています。
STDOUT

 その出力は、クライアント・アプリケーションになります。
バイナリ

 読み、テキストではなく、バイナリ形式で保存されました。バイナリモードでは、と区切り文字NULLを宣言することはできません。
OIDS

 コピー・オブジェクト識別子(OID)内の各行のステートメント。(OIDないテーブルがOIDSオプションを宣言した場合は、エラーをスローします。)
デリミタ

 ファイル内の各行の各フィールドを区切る単一文字の場合。デフォルトでは、水平タブです。(タブ)
ヌル文字列

 NULL値を表す文字列。デフォルトでは\ N(バックスラッシュ-N)です。もちろん、あなたが自分自身に空の文字列を選ぶことができます。

 

注: 注:あなたが同じ文字列やCOPY TOを使用していることを確認する必要がありますのでコピーのいずれかの試合、FROMこの文字列は、NULL値として保存されます。

 

注意注意します

COPYはテーブルのみのためではなく、ビューを使用することができます。

BINARYキーワードは、すべてのデータを読み込み/テキストストレージとしてではなく、バイナリオブジェクトを強制します。ある程度速く、従来のコピーコマンドよりもそうするが、工場内のファイルのバイナリコピーするには、異なるマシンアーキテクチャの間で非常に良いではありません。


 あなたはアウトにコピーするデータはすべての権限を持っている必要がありますからコピーするための任意の挿入のためのデータテーブルにデータを選択する権限を持っている必要があります。

ファイル内のCOPYコマンドは、むしろより読み書きするクライアントアプリケーションによってサーバーやファイルを書き込むことによって直接読まなければなりません。そのため、彼らは、データベース・サーバやデータベースサーバ上にある必要があり、むしろこれらの事を行うには、クライアントによるよりも、アクセスすることができます。彼らは、PostgreSQLのユーザー(IDを実行しているユーザサーバ)へのアクセスを有することができ、読み取りまたは書き込みが可能ではなく、クライアントでなければなりません。それは読み取りを可能にするか、任意のサーバーを書くことは、ファイルへのアクセス権を持っているので、ファイルに名前を付けるCOPYだけ、データベースのスーパーユーザに許可されています。


 COPYとpsql命令混同しないでください  \コピーを。 \コピー  コールSTDIN FROM COPYまたはCOPY TO STDOUT、およびその後のデータは、psqlのクライアントがアクセスできるファイルに/ストアをフェッチ。このように、使用して  \をコピーし  たときに、クライアントではなくサーバー側の判断により、ファイルアクセス。


 我々は常にファイル名にCOPY絶対パスを使用することをお勧めします。行動がサーバによって強制されたときにTO COPYではなく、FROM COPYのために、あなたはファイルの相対パスでのステートメントからの読み込みのオプションがあります。パスは、サーバ(データディレクトリ)ではなく、クライアントの作業ディレクトリの作業ディレクトリからの相対解釈されます。

FROM COPYは任意のトリガを起動し、制約をチェックします。ただし、ルールが有効にされません。

COPYはへの最初のエラーで停止しました。これらは、TO COPYで問題につながるべきではありませんが、送信先テーブルからCOPYにすでに以前の行を受けていますが、ラインが見えるか、アクセスできませんが、それでもディスクスペースを占有します。あなたは、データファイルの大規模なコピーすることが起こる場合は、蓄積された、これらのものは、ディスク容量の大部分を占めることができます。あなたは、ディスク容量を回復するためにVACUUMを呼び出すことができます。

ファイル形式ファイル形式

テキスト形式のテキストフォーマット


 COPYを使用し、BINARYオプションなしで使用する場合、ファイルを読み書きするテキストファイルであり、テーブルの各行は、行を表します。区切り文字で区切られた行の列(フィールド)。属性自体は、各フィールドタイプ、いずれかの列に許容可能な入力機能に関連付けられた出力関数によって生成された文字列の値です。そのフィールドのNULL値で表される特定のデータ列を使用すると、NULLです。入力ファイルの任意の行が予想よりも少ないか、フィールドが含まれている場合は、エラーがスローされますFROMコピーします。あなたはOIDを宣言する場合は、最初のフィールドとしてOIDが読み込まれ、すべてのユーザフィールドの前に、書きます。


 ラインデータの終了は、バックスラッシュとピリオド(\。)表現が含まれて使用することができます。データは、ファイルから読み込んだ場合は、データマーカーの終わりが、必要はありませんので、良い上のファイルの役割の終わり、しかし3.0クライアントプロトコルの前に、コピーした場合は、その後、クライアントアプリケーション間でのデータあなたは、終了タグを持っている必要があります。


 バックスラッシュ文字(\)は、それらの文字にコピーして使用することができる(そうでなければ、それらの文字は、行または列の区切り文字としてであろう)あいまいなエスケープであろう。バックスラッシュ自体、改行、キャリッジリターン、および現在のデリミタ:特に、それはフィールド値の一部である場合、次の文字はバックスラッシュが先行されなければなりません。


 これは、バックスラッシュを追加することなく、ヌル文字列COPY TOを宣言され、コントラストは、比較的空の入力文字列にバックスラッシュを削除する以前からコピーします。したがって、\空の文字列等はなく、実際のデータ値(\\ Nとして表現される)Nとの間のこのようなN \混乱。

FROM COPY特別なバックスラッシュ、次の認識配列:

\ Bバックスペース(ASCII 8)

\ Fフィード(ASCII 12)

\ N改行(ASCII 10)

\ Rキャリッジリターン(ASCII 13)

\ Tタブ(ASCII 9)

\ V垂直タブ(ASCII 11)

\ 数字(3進値が続くバックスラッシュは文字指定された値を表しています)


 現在、COPY TO 8進のバックスラッシュシーケンスを発することはありませんが、それは制御文字について先に記載されている他の文字を使用しません。


 データNまたはピリオド(。)前ににバックスラッシュ文字を置いてはいけません。そのような組合せは、それぞれ、空の文字列(\。)またはデータ終了タグ(\ N)と間違われることであろう。また、バックスラッシュ文字は、上記の表にリストされていない独自のです。


 強く、アプリケーションがCOPY 8つの改行やデータは、\ nと\ rの列に変換されているキャリッジリターンを生成することをお勧めします。現時点では、我々はデータの改行を表すことができ、およびバックスラッシュと改行でバックスラッシュと改行でデータ改行を表します。しかし、そのような表現は、将来のリリースでは、デフォルトでは受け入れられない場合があります。

COPYファイルは、(たとえば、UNIXからWindowsまたはその逆に)異なるマシン間で転送された場合、彼らはまた、汚職に非常に脆弱です。

TO COPY各ラインのJiangzaiの終わりには、だけのために、MS Windowsのタグラインの終了時に実行するサーバー上、または(「\ r \ nの」)でUnixスタイルの改行(「\ n」)をありますサーバファイルへのCOPY;プラットフォーム間で一貫性のため、STDOUTにコピーし、常にどんなサーバープラットフォームはい、「\ n」を送信しません。そのFROM COPYは、ラインデータの末尾としてキャリッジ・リターンまたは改行、キャリッジ・リターンまたは改行で処理することができます。入力行の終わり場合、新しい行の脱出を削減するために、データや輸送による誤差には表示されません、上記の記号とは異なり、FROM COPYは警告しています。

バイナリ形式のバイナリ形式


 ファイル形式ではPostgreSQL 7.4でのCOPY BINARY変更を行います。新しいフォーマットは、ファイルヘッダ、ゼロ以上のタプル、ファイルトレーラから成ります。ヘッダーとデータはネットワークバイトオーダーになりました。

ファイルヘッダのヘッダ


 ファイルヘッダは、可変長ヘッダ拡張領域に続く固定長フィールドの15バイトから成ります。固定フィールドは以下のとおりです。

署名署名
11-バイトシーケンスPGCOPY \ n \ 377 \ rをする\ n \ 0 ---ゼロバイトが署名の一部であることに注意が必要です。(署名は私たちが容易にファイルを台無し非8ビット変換されたかどうかを見ることができるように設計されている。署名は線変換フィルタの端になり、ゼロバイトを落とし、高ビット、またはパリティを落とし変更されます。)
Flagsフィールドフラグフィールド

 ファイル形式の重要な側面を示すために32ビット整数マスク。ビット0(LSB)31(MSB)から番号付けされているすべての整数であるとして、このフィールドは、ネットワークオーダー(上位バイトが最初)に格納されることに注意してください---符号化されます。ビット16--31は、重要なファイル形式情報を示すために予約されている、読者がこの範囲に現れ知らないビットを見つけた場合、それが終了する必要があります。ビット0-15は、下位互換性のシンボル形式として予約され、読者はこの範囲内の任意の予期せぬビットを無視してもよいです。他の人がゼロでなければならない一方、現在唯一の我々は、フラグを定義します。
ビット16

 1場合、OIDは、データに含まれる; 0の場合、無

 

ヘッダ拡張長さの範囲

 自身を除く、ヘッダの長さを残りのバイトの32ビット整数。現在のところ、それは最初のタプルに続く、ゼロです。フォーマットへの今後の変更は、追加データがヘッダーに表示することができます。読者はそれを処理する方法を知っていない任意のヘッダ拡張データを無視すべきです。

 


 ヘッダ拡張が使用するカスタム・データ・ブロックの予約シーケンスです。このフラグフィールドは、どのような拡張領域はい読者に伝えるためのものではありません。ヘッダ拡張内容の具体的な設計は、将来のバージョンで使用するために残されます。


 この設計は、下位互換性のヘッダの追加を可能にする(ヘッダ拡張チャンク、またはセット下位フラグビットを追加)および修飾非下位互換性(このような変化を同定するための高フラグビットを設定し、必要なデータの拡張領域へのサポートを追加します)。

タプルタプル

16ビット整数の数の初めに各タプルは、このカウントは、タプル内のフィールドの数です。(現在は、テーブル内のすべてのタプルは同じカウントを有するが、必ずしも真ではないかもしれない。)次に、タプルバック、32ビットの第1フィールドワード長の各フィールドについて繰り返し、そう長く続きますフィールドデータ。(長さワード自体を含まない、ゼロであってもよい。)特別な場合として:-1 NULLフィールド値を示しています。NULLの場合は値なしバイト。

アライメントパディングない、またはフィールド間の任意の他の追加のデータなし。

現在、COPY BINARYファイル内のすべてのデータ値はバイナリ形式(フォーマットコードもの)であると仮定されます。予想される将来の拡張ごとのカラム形式コードを可能にするヘッダフィールドを追加することができます。

適切なバイナリ形式実際のタプルデータを決定することができべきPostgreSQLソース、特定のフィールドのデータ・タイプ*送信と* recv関数(SRC /バックエンド/ utilsの/ ADT /ディレクトリのソースコード内の典型的には、これらの機能)を見つけます。

あなたはファイル内のOIDが含まれている場合、OIDフィールドがすぐにフィールドカウントワードを次の。これは、一般的なフィールドですが、それはカウント・フィールドに含まれていません。しかし、それはこれが4バイト、8バイトOIDを処理することができますあまりにも多くの労力を費やすことない私たちを可能にし、男はOIDがオプションである許可されている場合、それはまたにOIDを表示することができます---長さの単語を持っています空。

ファイルのファイル・トレーラ・エンド


 ファイルトレーラは、16ビット整数1で構成されています。これは、タプルからフィールドカウントを区別することが容易になります。


 フィールドカウントワードが-1でも、列の予想数でもない場合には、読者はエラーを報告しなければなりません。これは、データの同期を欠落しているため、余分なチェックを提供します。

以下、実施例


 縦線(|)を使用してクライアントに次の例をコピーし、テーブル、フィールド区切り文字として:

 

区切り文字でSTDOUT TO COPY国 '|';


 国テーブルにUnixファイルからデータをコピーします。

 

'/ USR1 / projの/ブレイ/ SQL / country_data' からCOPY国。


 ここでSTDINからの例では、データテーブルにコピーすることができるされています。

 

AFアフガニスタン
AL ALBANIA 
DZアルジェリア
ZMザンビア
ZWジンバブエ


 ここでは、空白の各行は、実際に水平タブ]タブであることに注意してください。


 以下のデータが同じである、のLinux / i586のマシン上のバイナリ形式で出力します。これらのデータは、UNIXユーティリティを用いて得られた  ODの-c  ろ過出力後。表は、3つのフィールドがあり、最初の文字(2)、2番目のテキストであり、そして第三の整数です。すべての行3番目のフィールドはNULL値です。

 

0000000 PGCOPY \ N 377 \ rをする\ n \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 
0000020 \ 0 \ 0 \ 0 \ 0 003 \ 0 \ 0 \ 0 002 AF \ 0 \ 0 \ 0 013 
0000040 FGHANISTAN 377 377 377 377 \ 0 003 
0000060 \ 0 \ 0 \ 0 002 AL \ 0 \ 0 \ 0 007アルバーニ
0000100 377 377 377 377 \ 0 003 \ 0 \ 0 \ 0 002 DZ \ 0 \ 0 \ 0 
0000120 007アルジェリア377 377 377 377 \ 0 003 \ 0 \ 0 
0 \ 0000140 \ 0 002 ZM \ 0 \ 0 006ザンビア377 377 
0000160 377 377 \ 0 003 \ 0 \ 0 \ 0 002 ZW \ 0 \ 0 \ 0のb ZI \ 
0000200 MBABWE 377 377 377 377 377 377

互換性


 標準SQLにはCOPY文はありません。


 7.3以前のアプリケーションはまだサポートされ、次の構文を使用します。

 

COPY [BINARY] テーブル名 [OIDS WITH] 
    { 'FROM ファイル名 ' | STDIN} 
    [USING] DELIMITERS ' デリミタ '] 
    [ 'AS NULL WITH NULL文字列 '] 

COPY [BINARY] テーブル名 [OIDS WITH] 
    { 'にファイル名 ' | STDOUT} 
    [USING] DELIMITERS ' デリミタ '] 
    [ 'AS NULL WITH NULL文字列 ']

おすすめ

転載: www.cnblogs.com/fanweisheng/p/11077007.html