MySQL/MariaDB导入(load data infile)导出(select into outfile)

1.select into outfile

1)创建表并插入数据

MariaDB [mt]> create table filetest(a int,b int,c int);
Query OK, 0 rows affected (0.014 sec)

MariaDB [mt]> insert into filetest values(1,2,3)
    -> ,(2,3,4),(3,4,5),(4,5,6),(5,6,7),(6,7,8);
Query OK, 6 rows affected (0.005 sec)
Records: 6  Duplicates: 0  Warnings: 0

MariaDB [mt]> select * from filetest;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |    3 |
|    2 |    3 |    4 |
|    3 |    4 |    5 |
|    4 |    5 |    6 |
|    5 |    6 |    7 |
|    6 |    7 |    8 |
+------+------+------+
6 rows in set (0.000 sec)

2)导出:

语法:

SELECT ... INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        [export_options]
 
export_options:
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
]

说明:

FIELDS,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项: 
  terminated by描述字段的分隔符,默认情况下是tab字符(\t) 
  enclosed by描述的是字段的括起字符。
  escaped by描述的转义字符。默认的是反斜杠(backslash:\ ) 
LINES 关键字指定了每条记录的分隔符默认为'\n'即为换行符,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
  terminated by 分隔符:意思是以什么字符作为一行结束
  STARTING BY分隔符:意思是以什么字符作为一行开始

示例1:
SELECT * FROM filetest INTO OUTFILE 'E:/test/a.txt';

报错:
MariaDB [mt]> SELECT * FROM filetest INTO OUTFILE 'E:\test\a.txt';
ERROR 1290 (HY000): The MariaDB server is running with the --secure-file-priv option so it cannot execute this statement

MariaDB执行select into outfile和load data outfile,outfile应该在secure_file_priv全局变量指定的文件夹,这个全局变量必须在配置文件中进行配置
修改配置文件,[mysqld]部分最下面加如下配置
secure_file_priv=E:/test
重启MariaDB,然后重新导出:

ariaDB [mt]> SELECT * FROM filetest INTO OUTFILE 'E:/test/a.txt';
Query OK, 6 rows affected, 1 warning (0.004 sec)

导出成功,文件如下:

 

 

 

示例2:

SELECT * FROM filetest INTO OUTFILE 'E:/test/b.txt' FIELDS TERMINATED BY '&' LINES TERMINATED BY '#'; 

导出效果:

 

 

 示例3:

SELECT * FROM filetest INTO OUTFILE 'E:/test/b.txt' FIELDS TERMINATED BY '&' LINES TERMINATED BY '#\n'; 

导出效果:

 

 

 

2.load data infile

load data infile语句从一个文本文件中以很高的速度读入一个表中。为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或secure_file_priv指定目录。另外,为了对服务器上文件使用load data infile,在服务器主机上你必须有file的权限。

1)基本语法:

LOAD DATA [LOW_PRIORITY | CONCURRENT] 
[LOCAL] 
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (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,...)]
[SET col_name = expr,...]

[LOW_PRIORITY | CONCURRENT]:如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令:load data low_priority infile "/home/mark/data sql" into table Orders;
[LOCAL]:如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上。
[REPLACE | IGNORE]replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略。
FIELDS,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
  terminated by描述字段的分隔符,默认情况下是tab字符(\t)
  enclosed by描述的是字段的括起字符。
  escaped by描述的转义字符。默认的是反斜杠(backslash:\ )
例如:load data infile "/home/mark/Orders txt" replace into table Orders fields terminated by',' enclosed by '"';
LINES 关键字指定了每条记录的分隔符默认为'\n'即为换行符,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
  terminated by 分隔符:意思是以什么字符作为一行结束
  STARTING BY分隔符:意思是以什么字符作为一行开始

例如:load data infile "/jiaoben/load.txt" replace into table test fields terminated by ',' lines terminated by '/n';

2)关于灵活性,其实也就是一个记录功能
如果想在导入的时候记录一下导入的具体时间怎么办?

mysql> load data infile '/tmp/t0.txt' into table t0 character set gbk 
	   fields terminated by ',' enclosed by '"' 
	   lines terminated by '\n' (`name`,`age`,`description`) 
	   set update_time=current_timestamp;

示例:将前面的c.txt导回

mysql> load data infile 'E:/test/c.txt' into table filetest character set utf8 
	fields terminated by '&'  
	lines terminated by '#\n';

  

posted @ 2020-09-25 19:12  守望一心  阅读(890)  评论(0编辑  收藏  举报