LOAD DATA
功能描述
将文件中的数据导入到数据库指定表中。
注意事项
- LOAD DATA语法仅在MYSQL兼容模式(sql_compatibility = 'MYSQL')下支持。
- LOAD DATA语法仅在开启b_format_version='5.7'和b_format_dev_version='s2'参数后与MYSQL功能一致。
- LOAD DATA语法权限相关GUC参数与COPY FROM语法注意事项一致。
- LOAD DATA语法需要拥有表的INSERT和DELETE权限。
- 执行LOAD DATA语法写入表中的数据若无法转换为表中数据类型格式时,将导致导入失败。
- LOAD DATA只能用于表,不能用于视图。
语法格式
LOAD DATA [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [PARTITION (partition_name [, partition_name] ...)] [CHARACTER SET charset_name] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number {LINES | ROWS}] [(col_name_or_user_var [, col_name_or_user_var] ...)] [SET col_name={expr | DEFAULT} [, col_name={expr | DEFAULT}] ...]
参数说明
- LOCAL
指定导入文件的位置。
不指定LOCAL时,若file_name为相对路径,则默认导入路径为数据目录。
若指定LOCAL参数则需要指定file_name为绝对路径,当指定为相对路径时默认导入路径为数据库二进制所在路径,即$GAUSSHOME/bin/。
当导入数据与表中数据冲突或文件中字段数小于指定表中字段数时,指定LOCAL与指定IGNORE作用一致。
- REPLACE | IGNORE
当导入数据与表中原有数据冲突时,若指定REPLACE,则替换冲突行数据;若指定IGNORE,则跳过冲突行数据,继续导入。若数据冲突但不指定REPLACE、IGNORE或LOCAL中任意一个,则终止导入并报错。
若文件字段数小于指定表列数,指定LOCAL或IGNORE参数会为剩余列赋默认值。不指定IGNORE或LOCAL参数会报错。
- PARTITION
当导入表为分区表时,此参数用来指定分区。若数据与指定分区范围不一致,则报错。
- CHARACTER SET
指定数据文件的编码格式名称,缺省为当前客户端编码格式。
- FIELDS | COLUMNS
- TERMINATED BY
指定两列之间分隔符,缺省为“\t”。
指定换行符不能与分隔符相同。
- [OPTIONALLY] ENCLOSED BY
指定引号字符,缺省为''。
OPTIONALLY参数为可选参数,无实际作用。
引号符仅支持单字符,不支持字符串。
- ESCAPED BY
指定转义符,缺省为“\”。
转义字符仅支持单字符,不支持字符串。
- TERMINATED BY
- LINES
- STARTING BY
指定导入数据文件起始字段样式。
- TERMINATED BY
指定导入数据文件换行符样式。
- STARTING BY
- IGNORE
指定数据导入时,跳过数据文件的前number行。
- col_name_or_user_var
可选的待复制字段列表。
取值范围:如果没有声明字段列表,将使用所有字段。
- 指定列参数不支持重复指定列。
- LOAD DATA语法指定列时,col_name_or_user_var仅支持指定为表中存在列,不支持指定为用户变量。
- SET
指定列值,可以指定为表达式或DEFAULT。
- 表达式中不支持列名。
- 若表达式结果类型与被赋值列对应类型之间不存在隐式转换函数则报错。
示例
--创建表。 gaussdb=# CREATE TABLE load_data_tbl1(load_col1 INT UNIQUE, load_col2 INT, load_col3 CHAR(10)); --向表中插入一条数据。 gaussdb=# INSERT INTO load_data_tbl1 VALUES(0,0,'load0'); --从文件/home/omm/load1.csv中复制数据到load_data_tbl表,指定列名,设置.load_col3列值统一为"load"。 gaussdb=# LOAD DATA INFILE '/home/omm/load1.csv' INTO TABLE load_data_tbl1(load_col1, load_col2) SET load_col3 = 'load'; --后面导入数据load_col3列值均为'load' gaussdb=# SELECT * FROM load_data_tbl1; load_col1 | load_col2 | load_col3 -----------+-----------+------------ 0 | 0 | load0 3 | 3 | load 1 | 1 | load 2 | 2 | load (4 rows) --从文件/home/omm/load2.csv中复制数据到load_data_tbl表.,指定IGNORE忽略冲突 gaussdb=# LOAD DATA INFILE '/home/omm/load2.csv' IGNORE INTO TABLE load_data_tbl1; --表load_data_tbl1中数据不变,冲突数据跳过。 gaussdb=# SELECT * FROM load_data_tbl1; load_col1 | load_col2 | load_col3 -----------+-----------+------------ 0 | 0 | load0 3 | 3 | load 1 | 1 | load 2 | 2 | load (4 rows) --创建分区表 gaussdb=# CREATE TABLE load_data_tbl2 ( load_col_col1 INT, load_col_col2 INT ) PARTITION BY RANGE (load_col_col2) ( PARTITION load_p1 VALUES LESS THAN(3), PARTITION load_p2 VALUES LESS THAN(9), PARTITION load_p3 VALUES LESS THAN(MAXVALUE) ); --从文件/home/omm/load3.csv中复制数据到load_data_tbl2表.,指定PARTITION。 gaussdb=# LOAD DATA INFILE '/home/omm/load3.csv' INTO TABLE load_data_tbl2 PARTITION (load_p2); --数据导入到load_data_tbl2表中指定分区 gaussdb=# SELECT * FROM load_data_tbl2; load_col_col1 | load_col_col2 ---------------+--------------- 4 | 4 5 | 5 (2 rows) --创建表 gaussdb=# CREATE TABLE load_data_tbl3(load_col_col1 CHAR(30)); --从文件/home/omm/load4.csv中复制数据到load_data_tbl3表.,指定FIELDS ENCLOSED BY; gaussdb=# LOAD DATA INFILE '/home/omm/load4.csv' INTO TABLE load_data_tbl3 FIELDS ENCLOSED BY '"'; --数据"load test quote"双引号被去掉,'load test single_quote'单引号保留 gaussdb=# select * from load_data_tbl3; load_col_col1 -------------------------------- load test quote 'load test single_quote' (2 rows) --删除表。 gaussdb=# drop table load_data_tbl1; gaussdb=# DROP TABLE load_data_tbl2; gaussdb=# DROP TABLE load_data_tbl3;