mysql 的load data infile

2019-01-03 14:46:31于丽

• 如果没有指定LOCAL,文件是位于服务器的主机上,并且直接被服务器读取。
当从服务器主机定位文件时,服务器使用下列规则:
• 如果给定完整的路径,服务器使用该路径名。
• 如果给定一个或多个前置构件的相对路径,服务器以相对服务器的数据目录搜索文件。
• 如果给定没有前置构件的文件名,服务器从当前数据库的数据库目录搜寻文件。
注意:

这些规则意味着,一个以'/gsfile.txt' 给出的文件是从服务器的数据目录中读取的,然而,以`gsfile.txt' 给出的一个文件是从当前数据库的数据目录下读取的。举例来说,下面的LOAD DATA 语句从db1 数据库目录下读取文件'data.txt',因为db1 是当前数据库,即使语句明确把文件载入到db2数据库中的表里,也会从db1 目录中读取:

sqlcli> USE db1;
sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE db2.gs_table;

注意:

指定Windows 路径名时,使用的是斜线而不是反斜线。如果要用反斜线,必须双写。
出于安全的原因,当读取位于服务器上的文本文件时,文件必须位于数据库目录下或者可以被所有用户读取。也就是说,当对服务器上的文件执行LOAD DATA INFILE 时,用户必须获得FILE 权限。
参考管理员手册中的GBase 提供的权限 。

与服务器直接访问文件相比,使用LOCAL 速度稍微慢些,这是因为文件的内容必须通过客户端到服务器的连接传送。另一方面,对于本地文件,不需要获得FILE 权限。

只有服务器和客户端都允许时,LOCAL 才可以工作。例如,如果kernel 启动时,--local-infile=0,则LOCAL 不能工作。参考管理员手册中的LOAD DATA LOCAL 的安全问题 。

REPLACE 和IGNORE 关键字处理那些与已存在的主键值重复的输入记录。

如果指定了REPLACE,输入行将会代替已存在的行(也就是说,主索引值相同的行将作为存在的行)。参考REPLACE 语法 。

如果指定了IGNORE,与已存在行主键值重复的输入行将被跳过。如果不指定二者中的任一个,则操作行为将依赖是否指定了LOCAL 关键字。没有指定LOCAL,则如果发现有重复的键值,将产生一个错误,并忽略文本文件的其余部分。如果指定了LOCAL,则缺省的操作行为将与指定了IGNORE 的相同;这是因为,在操作过程中,服务器没有办法终止文件的传送。

如果希望装载操作中忽略外键约束,可以在执行LOAD DATA 之前执行SET FOREIGN_KEY_CHECKS=0 语句。
如果用户在一个空的GsSYS 表上使用LOAD DATA INFILE,所有非唯一索引会以分批方式被创建(就像REPAIR)。当有许多索引时,这通常可以使LOAD DATA INFILE 更快一些。正常情况下非常快,但也有极端的情况,用户可以通过在装载文件之前使用ALTER TABLE .. DISABLE KEYS 关闭它们和在装载文件之后使用ALTER TABLE .. ENABLE KEYS 重建索引,从而加速索引创建。参考管理员手册中的加速INSERT 语句 。