COPY
制約: COPY コマンドは使用できません。 ロード/アンロード操作には、nzload コマンドまたは CREATE EXTERNAL TABLE コマンドを使用してください。 これらのコマンドは、COPY コマンドより高速かつ安定に動作します。 COPY コマンドは、内部操作に使用されるため、ここで取り上げています。
- COPY TO コマンドは、表の内容全体をファイルにコピーします。 COPY TO コマンドは、列デフォルトには影響しません。
- COPY FROM コマンドは、ファイルから表にデータをコピーします。 既に表にデータが存在する場合には、このコマンドを実行すると表に追加されます。
SQL92 には COPY コマンドはありません。 COPY コマンドはプレーン表で使用できますが、ビューでは使用できません。
COPY コマンドを使用すると、システムは表の行ごとに 1 ラインを持つテキスト・ファイルの読み取りや書き込みを行います。 1 行内の列 (属性) は区切り文字で区切られます。 属性値は、出力関数が各属性のデータ型に応じて生成したストリングか、または入力関数が受け入れ可能なストリングです。 NULL の属性に対しては、指定された NULL 値ストリングが使用されます。
デフォルトでは、テキスト・コピーの際のフィールド間の区切り文字としてタブ ("\t") が使用されます。 フィールド区切り文字は、using delimiters キーワード句を使用して他の任意の単一文字に変更できます。 データ・フィールドが区切り文字と一致する場合、システムは、データ・フィールドにバックスラッシュの引用符文字を使用します。 バックスラッシュ・ピリオド( \.)を含む 1 行でデータ終了を表すことができます。UNIX ファイルから読み込む場合はデータ終了マーカーは不要ですが、クライアント・アプリケー ションとの間でデータをコピーする場合は終了マーカーを指定する必要があります。
COPY コマンドは、最初のエラーで動作を停止します。 これは、COPY FROM コマンドの場合は問題になりません。 COPY TO コマンドの場合、ターゲット・リレーションはエラー発生以前の行を既に受信しています。 これらの行は表示やアクセスができませんが、ディスク容量を占有し続けます。 大規模なコピー動作でエラーが発生した場合には、無駄なディスク容量が膨大になることがあります。
COPY コマンドのデータで行や列の区切り文字と間違われるデータ文字には、バックスラッシュ文字 (\) を使用して引用することができます。 特に、バックスラッシュそのもの、改行文字、および現在の区切り文字が属性値の一部として表示される場合は、これらの前にバックスラッシュを付ける必要があります。
ファイル名を使用する場合には、必ず絶対パスを指定してください。 データベース・サーバーの都合上、COPY TO コマンドには絶対パスが必要とされますが、COPY FROM コマンドの場合には、相対パスで指定されたファイルから読み出すという選択もできます。 システムは、Netezza Performance ServerSQL 作業ディレクトリーではなく、データベース・サーバーの作業ディレクトリーからの相対パスを解釈します。
| 順序 | 次を表します |
|---|---|
| \b | バックスペース (ASCII 8) |
| \f | フォーム・フィード (ASCII 12) |
| \n | 改行文字 (ASCII 10) |
| \r | キャリッジ・リターン (ASCII 13) |
| \t | タブ (ASCII 9) |
| \v | 垂直タブ (ASCII 11) |
| \digits | バックスラッシュの後に 1 ~ 3 文字までの 8 進数が続く場合、その数値コードを持つ文字を表します。 |
COPY TO コマンドは、8 進数のバックスラッシュ・シーケンスを出力しませんが、前の表にリストされている他のシーケンスをそれらの制御文字に使用します。
COPY コマンド・データを生成するアプリケーションでは、データの改行を \n というシーケンスに変換し、キャリッジ・リターンを \r というシーケンスに変換します。
各行の終わりはUNIXスタイルの改行("˶")で示される。 COPY FROM コマンドは、DOS スタイルまたは Mac スタイルの改行文字を含むファイルでは正しく動作しません。
構文
COPY [BINARY] table
FROM { 'file name' | stdin }
[ [USING] DELIMITERS 'delimiter' ]
[ WITH NULL AS 'null string' ];COPY table
TO { 'file name' | stdout }
[ [USING] DELIMITERS 'delimiter' ]
[ WITH NULL AS 'null string' ];入力
COPY コマンドの入力は以下のとおりです。
| 入力 | 説明 |
|---|---|
| バイナリー | フィールドの形式設定を変更します。 すべてのデータがテキスト形式ではなくバイナリー形式で保存や読み取りされるように設定します。 |
| デリミッター | ファイルの各行内のフィールドを区切る文字。 |
| ファイル名 | 入力ファイルまたは出力ファイルの絶対パス名。 |
| ヌル・ストリング | NULL 値を表すストリングです。 デフォルトは「\N」(バックスラッシュと N) です。 コピー入力時、このストリングに一致するデータ項目はすべて NULL 値として保存されます。 コピー出力時に使用したストリングと同じストリングを使用してください。 |
| 標準入力 | 入力はクライアント・アプリケーションから送信されます。 |
| 標準出力 | 出力はクライアント・アプリケーションに送信されます。 |
| 表 | 既存の表の名前。 |
出力
| 出力 | 説明 |
|---|---|
| COPY | コピーが正しく終了した場合にシステムがこのメッセージを返します。 |
| ERROR: reason | コピーが失敗した場合、システムは失敗の理由とともにこのメッセージを返します。 |
特権
COPY コマンドで値が読み取られる表に対する Select 特権を持つ必要があります。 COPY コマンドによって値が挿入される表に対して Insert 特権または Update 特権のいずれかを持つ必要があります。 データベース・サーバーでは、COPY コマンドによって読み取りや書き込みが行われるファイルに対する適切な権限が必要になります。
使用法
- 縦棒 (|) をフィールド区切り文字として使用して、表を標準出力にコピーします。
MYDB.SCH1(USER)=> COPY country TO stdout USING DELIMITERS '|'; - UNIXファイルからテーブル国にデータをコピーする:
MYDB.SCH1(USER)=> COPY country FROM '/usr1/proj/bray/sql/country_data'; - この例は、stdin から表にコピーする場合に適したデータです (したがって、最終行に終端シーケンスがあります)。
AF AFGHANISTAN AL ALBANIA DZ ALGERIA ZM ZAMBIA ZW ZIMBABWE \.