LOAD DATA は、テキストファイルから行を読み取り、PolarDB-X テーブルに挿入します。これは、フラットファイルを一括ロードする最も高速な方法であり、ローカルクライアント上のファイル(LOCAL)およびサーバー側のファイルの両方で動作します。
事前準備
クライアントで LOAD DATA LOCAL INFILE 文を実行する前に、
local-infileを有効化してください。LOAD DATA はトランザクションではありません。 インポート中にデータベースクラッシュなどの障害が発生した場合、一部の行のみが挿入され、他の行は挿入されない可能性があります。大規模なインポート後には、必ず行数を確認してください。
構文
LOAD DATA
[LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_mask [, col_name_or_mask] ...)]パラメーター
| パラメーター | 説明 |
|---|---|
LOCAL | クライアントホストからファイルを読み取ります。省略した場合、サーバーホストから読み取ります。 |
file_name | ソースファイルのパスです。相対パスは、クライアントを起動したディレクトリを基準として解決されます。 |
REPLACE | IGNORE | ファイル内の行と既存の行でプライマリキーが重複した場合の動作を制御します。詳細については、「プライマリキーの重複処理」をご参照ください。 |
CHARACTER SET charset_name | 入力ファイルの文字セットです。 |
[FIELDS] TERMINATED BY 'string' | フィールドデリミタです。デフォルト値:\t(タブ)。 |
[FIELDS] ENCLOSED BY 'char' | フィールド値を囲む文字です。たとえば、ENCLOSED BY '"' を指定すると、挿入前に周囲の二重引用符が削除されます。 |
[FIELDS] ESCAPED BY 'char' | エスケープ文字です。 |
[LINES] STARTING BY 'string' | 各行の先頭から解析前に削除するプレフィックスです。 |
[LINES] TERMINATED BY 'string' | 行デリミタです。デフォルト値:\n。 |
IGNORE number LINES | IGNORE number ROWS | 先頭からスキップする行数です。ヘッダ行をスキップするために使用します。たとえば、IGNORE 1 LINES は最初の行をスキップします。 |
(col_name_or_mask, ...) | ファイルの列とテーブルの列をマップします。列名を指定するとその列がインポートされ、ユーザー変数(例:@dummy)を指定するとその列は破棄されます。この句を省略した場合は、列が順番にマップされます。 |
プライマリキーの重複処理
ファイル内の行とテーブル内の既存の行でプライマリキーが重複した場合、指定するキーワードに応じて以下の動作になります。
| キーワード | 動作 | 使用タイミング |
|---|---|---|
REPLACE | 既存の行が新しい行で置き換えられます。 | このファイルには、データの公式かつ最新のバージョンが含まれています。 |
IGNORE | 新しい行は静かに破棄され、既存の行が保持されます。 | ファイルに重複が含まれる可能性があるが、テーブル内の既存データを優先する場合。 |
例
ヘッダ行付きの区切り形式ファイルのインポート
以下の例では、パーティションテーブルを作成し、ローカルファイルからデータをロードします。このファイルでは、フィールド区切り文字としてカンマを使用し、各行の先頭から test のプレフィックスを削除し、1 行のヘッダ行をスキップします。
テーブルの作成:
CREATE TABLE test (
a int(11) NOT NULL DEFAULT '0',
b varchar(8) NOT NULL,
PRIMARY KEY (a)
) DBPARTITION BY hash(a);ソースファイル(~/test.txt):
x,y
test1,2
test2,3
test3,4
test4,5
test5,6
test7,8
test8,9インポート文:
LOAD DATA LOCAL INFILE '~/test.txt'
IGNORE
INTO TABLE test
FIELDS TERMINATED BY ','
LINES STARTING BY 'test' TERMINATED BY '\n'
IGNORE 1 LINES;STARTING BY 'test' は、各行の先頭から test のプレフィックスを解析前に削除するため、test1,2 は 1,2 に変換されます。IGNORE 1 LINES は x,y のヘッダ行をスキップします。
期待される結果:
SELECT * FROM test ORDER BY a;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
| 5 | 6 |
| 7 | 8 |
| 8 | 9 |
+------+------+
7 rows in set (0.02 sec)CSV ファイルのインポート
二重引用符で囲まれたフィールドとヘッダ行を持つ標準的な CSV ファイルの場合:
LOAD DATA LOCAL INFILE '/path/to/data.csv'
INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;ソースファイル内の列をスキップ
ターゲットテーブルよりも列数が多いソースファイルから、選択した列のみをインポートするには、不要な列を破棄するプレースホルダーとしてユーザー変数を使用します。
以下の例では、3 列のファイルを 2 列のテーブルにインポートし、2 列目を破棄しています。
-- テーブル:test(x int, y int)
-- ファイルの列:col1, col2(破棄), col3
LOAD DATA LOCAL INFILE '/path/to/data.txt'
INTO TABLE test
(x, @dummy, y);x にはファイルの最初の列の値が割り当てられ、@dummy は 2 列目の値を受けて破棄し、y には 3 列目の値が割り当てられます。