データを読み込む
LOAD DATAステートメントのバッチはデータを TiDB テーブルにロードします。
あらすじ
- LoadDataStmt
LoadDataStmt ::=
'LOAD' 'DATA' LocalOpt 'INFILE' stringLit DuplicateOpt 'INTO' 'TABLE' TableName CharsetOpt Fields Lines IgnoreLines ColumnNameOrUserVarListOptWithBrackets LoadDataSetSpecOpt
パラメーター
LocalOpt
LocalOptパラメータを構成することで、インポートされたデータ ファイルがクライアント上にあるのか、サーバー上にあるのかを指定できます。現在、TiDB はクライアントからのデータ インポートのみをサポートしています。したがって、データをインポートするときは、 LocalOptからLocalの値を設定します。
FieldsとLines
パラメータFieldsとパラメータLinesを設定することで、データ形式の処理方法を指定できます。
FIELDS TERMINATED BY: 各データの区切り文字を指定します。FIELDS ENCLOSED BY: 各データの囲み文字を指定します。LINES TERMINATED BY: 行を特定の文字で終了する場合は、行終端文字を指定します。
次のデータ形式を例として取り上げます。
"bob","20","street 1"\r\n
"alice","33","street 1"\r\n
bob 、 20 、およびstreet 1を抽出する場合は、区切り文字を',' 、囲み文字を'\"'として指定します。
FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'
上記のパラメータを指定しない場合、インポートされたデータはデフォルトで次の方法で処理されます。
FIELDS TERMINATED BY '\t' ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE number LINES
IGNORE number LINESパラメータを設定すると、ファイルの最初のnumber行を無視できます。たとえば、 IGNORE 1 LINESを構成すると、ファイルの最初の行は無視されます。
さらに、TiDB は現在DuplicateOpt 、 CharsetOpt 、およびLoadDataSetSpecOptパラメーターの構文の解析のみをサポートしています。
例
CREATE TABLE trips (
trip_id bigint NOT NULL PRIMARY KEY AUTO_INCREMENT,
duration integer not null,
start_date datetime,
end_date datetime,
start_station_number integer,
start_station varchar(255),
end_station_number integer,
end_station varchar(255),
bike_number varchar(255),
member_type varchar(255)
);
Query OK, 0 rows affected (0.14 sec)
次の例では、 LOAD DATAを使用してデータをインポートします。区切り文字としてカンマを指定します。データを囲む二重引用符は無視されます。ファイルの最初の行は無視されます。
エラー メッセージERROR 1148 (42000): the used command is not allowed with this TiDB version表示された場合は、 エラー 1148 (42000): 使用されたコマンドは、この TiDB バージョンでは許可されていませんを参照してください。
LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikeshare-tripdata.csv' INTO TABLE trips FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);
Query OK, 815264 rows affected (39.63 sec)
Records: 815264 Deleted: 0 Skipped: 0 Warnings: 0
LOAD DATA 、 FIELDS ENCLOSED BYおよびFIELDS TERMINATED BYのパラメータとして 16 進 ASCII 文字式または 2 進 ASCII 文字式の使用もサポートします。次の例を参照してください。
LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikeshare-tripdata.csv' INTO TABLE trips FIELDS TERMINATED BY x'2c' ENCLOSED BY b'100010' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);
上の例では、 x'2c'は,文字の 16 進表現で、 b'100010'は"文字の 2 進表現です。
MySQLの互換性
このステートメントの構文は、 LOAD DATA...REPLACE INTO構文#24515を除き、MySQL と互換性があります。その他の構文互換性の違いは、GitHub では問題を通じて報告されましたである必要があります。
ノート:
- TiDB の以前のリリースでは、20000 行ごとに
LOAD DATAがコミットされました。デフォルトでは、TiDB は 1 つのトランザクションですべての行をコミットするようになりました。これにより、TiDB 4.0 以前のバージョンからアップグレードした後にエラーERROR 8004 (HY000) at line 1: Transaction is too large, size: 100000058が発生する可能性があります。このエラーを解決する推奨方法は、tidb.tomlファイルのtxn-total-size-limit値を増やすことです。この制限を増やすことができない場合は、tidb_dml_batch_sizeから20000に設定することで以前の動作を復元することもできます。- トランザクションでコミットされた行の数に関係なく、明示的なトランザクションの
ROLLBACKステートメントによってLOAD DATAロールバックされません。LOAD DATAステートメントは、TiDB トランザクション モードの構成に関係なく、常に楽観的トランザクション モードで実行されます。