15.1 导入和导出操作
MYSQL有两种SQL语句来用来导入数据从文件中到数据库或导出数据从数据库中到文件:
1.LOAD DATA INFILE 读取数据记录从文件中和插入他们到一个表中
2.select 。。。into OUTFILE 写一个select操作的结果到一个文件中
命令行有mysqlimport和mysqldump
15.2 导入和导出使用SQL
15.2.1 导入数据load data infile
load data infile读取值从一个单独数据文件。
load data infile ‘file_name’ into table table_name;
load data infile 'C:/mydata/data.txt' into table t;
load data [Local] infile 'file_name'
[IGNORE|REPLACE]
into table table_name
format_specifiers
[IGNORE n LINES]
[(column_list)]
[set (assignment_list)]
15.2.1.1 指定数据文件位置
默认情况下,MYSQL任务文件位于服务器中。MYSQL服务器直接读取文件
2.语句开始load data local infile 而不是load data infile,文件被读取从客户端。local意味着local对于客户端。
如果指定了先对路径就会从数据库的目录中寻找。
如果使用loacl来读取数据文件在客户端,路径名字翻译:
1.如果你引用文件通过它的全路径名,客户端在exact loaction
2.如果你指定了相对路径名,客户端程序寻找相对文件到它目前目录。
LOAD DATA LOCAL INFILE ‘/var/tmp/data.tx’ into table t;
LOAD DATA LOCAL INFILE 'data.txt' into table t;
15.2.1.2 跳过数据文件行
load data infile '/tmp/data.txt' into table t ignore 1 lines;
15.2.1.3 跳过自动标的列
默认情况下,数据文件行的排列顺序和表的排列顺序是一直的
列举一些列在下面的两种方式:
load data infile '/tmp/people.txt' into table subscriber (name,address);
顺序不同时采用 load data infile '/tmp/people.txt' into table subscriber (address,name);
15.2.1.4 skipping or transforming column values
跳过和转换列值
load data infile '/tmp/people2.txt' into table subscriber (@skip ,@firest,@last,address) set name= Concat(@first,' ',@last);
15.2.1.5 load data infile 和重复的记录
当数据文件在服务器端是处理,重复的记录如下:
1.输入记录引发一个重复键值冲突导致一个错误和剩下的数据文件没有被加载。处理的记录到点被加载进表
2.如果你指定了IGNORE关键字,新记录引发重复键值冲突被忽略和没有错误发生。load data infile处理整个文件,加载所有没有包含重复键值和抛弃剩下的
3.如果你指定了replace键值在文件名后,新的九楼引发重复键值冲突替代任何已经存在的表中的记录。
IGNORE和REPLACE都是排他性的。
15.2.1.6 由LOAD DATA INFILE提供的信息
15.2.1.7 对于LOAD DATA INFILE需要的特权
需要INSRT特权,如果指定了replace修饰符需要deltet特权。
15.2.1.8 load data infile的效率
使用load data with load data infile是比使用insert语句更加有效率。
15.2.2 exproting data
select * into outfile 'Country.txt' from country;
1.产生文件在服务器,为了发送到客户端
2.语句有FILE privilege获取文件
3.被创建的文件获取权限拥有MySQL服务器
4.输出文件每一行都包含一行。
言外之意:
1.如果你直接访问文件,必须登录夫妻否
2.文件全局可以读,任何登录系统的都可以读取它。
3.MySQL服务器拥有的文件,可能布包好移除它在你处理它后。需要mysql的管理员来移除它。
15.2.3 数据文件的格式指定
1.0 数据值被认为由tab字符终止
2 数据值被认为没有引用的。为了
默认的终止符是新行符,为了表明一个行终止,使用lines语句。
LINES TEMMINATED BY ‘\n’
ESCAPED BY :指定分隔符
select * into outfile '/tmp/data-out.txt'
FIELDS TEMINATED BY ',' ENCLOUSED by '"'
LINES TERMINATED BY '\r'
FROM t;
15.2.4 导入和导出NULL值
MYSQL使用\n来表明NULL值
1.如LOAD DATA INFILE,\n表明NULL,MYSQL转换一个空值为一个空字符,或者0,取决于相应的表列。
2.对于select ...into outfile,mysql写NULL值到输出文件\N。
15.3 导入和导出从命令行
mysqlimport options db_name input_file。。。
根据文件名来决定表名,每个表被加载都是已经存在的。--lines-terminated-by=string --fields=terminated-by=string
--fields-enclosed-by=char or --fields-optionally-encolose-by=char --fields-escaped-by=char
mysqlimport --lines-terminated-by='\r\n" world City.txt
shell> mysqlimport --fields-enclosed-by='"' world City.txt
其他的mysqlimport选项提供可选的控制对于数据文件的加载:
1.--ignore 或者--replace,处理重复的键值
2.--local 默认情况被加载的文件在服务器端,--local,mysqlimport读取数据文件和通过网络发送到服务器。
15.3.2 导出数据使用mysqldump
为了使用mysqldump来导出表作为tab分隔符的数据文件,指定--tab=dir_name选项。
mysqldump --tab=dir_name options db_name tab_name...
如:mysqldump --tab=/tmp world City
重新导入:cd /tmp mysql world < city.sql mysqlimport world City.txt
如果不想生成.sql文件,可以使用--no-create-info选项
这--all-databases和--databases选项对于mysqldump被用来输出多个数据。