日期:2014-05-16  浏览次数:20735 次

继续开帖发问:关于Access导入到mysql的问题
将Access里的10个表导入到mysql对应的表里,数据量大概是20W条左右,现在采用把ACCESS中的各表直接导出为文本文件,然后在MYSQL中用LOAD DATA FILE来加载导入数据,这样速度确实快了不少,但现在有一个问题:
我用语句:SELECT * INTO [TEXT;DATABASE=”d:/temp”].tablename.txt将Access指定表里的数据导入到对应的txt文件,结果导出的txt文件的第一行是每个列的名字,如果直接load该txt文件的话,mysql数据库里就会有一行数据是每个列的名字;请问我该怎么才能去掉这一行呢?

 
导出的txt文件的内容为:
“ID”, “FirstName”, “LastName”
1, Jay, Lin
2, Linda, Wang
我现在想将txt文件里的第一行去掉

Ps:其实可以通过遍历文件,然后再重写文件实现,但是这样对大数据量的话,速度太慢。


------解决方案--------------------
这种问题建议先看一下MYSQLP官方免费手册中的语法
引用
12.2.6. LOAD DATA INFILE Syntax
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_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]
[(col_name_or_user_var,...)]
[SET col_name = expr,...]


------解决方案--------------------
引用13.2.5. LOAD DATA INFILE语法
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...)]
LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。

要了解有关INSERT和LOAD DATA INFILE的效率的对比和有关LOAD DATA INFILE加速的更多信息,请参见7.2.16节,“INSERT语句的速度”。

由character_set_database系统变量指示的字符集被用于解释文件中的信息。SET NAMES和character_set_client的设置不会影响对输入的解释。

注意,目前不能载入UCS2数据文件。

您也可以通过使用mysqlimport应用程序载入数据文件;通过向服务器发送一个LOAD DATA INFILE语句实现此功能。--local选项用于使mysqlimport从客户主机中读取数据文件。如果客户端和服务器支持压缩协议,则您可以指定—compress选项提高在慢速网络中的性能。请参见8.10节,“mysqlimport:数据导入程序。

如果您使用LOW_PRIORITY,则LOAD DATA语句的执行被延迟,直到没有其它的客户端从表中读取为止。

如果一个MyISAM表满足同时插入的条件(即该表在中间有空闲块),并且您对这个MyISAM表指定了CONCURRENT,则当LOAD DATA正在执行时,其它线程会从表中重新获取数据。即使没有其它线程在同时使用本表格,使用本选项也会略微影响LOAD DATA的性能。

如果指定了LOCAL,则被认为与连接的客户端有关:

· 如果指定了LOCAL,则文件会被客户主机上的客
...






IGNORE number LINES选项可以被用于在文件的开始处忽略行。例如,您可以使用IGNORE 1 LINES来跳过一个包含列名称的起始标题行:

mysql> LOAD DATA INFILE '/tmp/test.txt'
-> INTO TABLE test IGNORE 1 LINES;
当您联合使用SELECT...INTO OUTFILE和LOAD DATA INFILE来从一个数据库中把数据写入一个文件中,然后再读取文件,返回到数据库中时,用于两个语句的field-和line-handling选项必须匹配。否则,LOAD DATA INFILE不会正确地理解文件的内容。假设您使用SELECT...INTO OUTFILE来编写一个的文件,字段由逗号分隔:

mysql> SELECT * IN

------解决方案--------------------
SELECT * INTO t4 IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=tmp;USER=root;Pwd=123;]
FROM T4;
这种形式不行吗?

------解决方案--------------------
你可以直接在ACCESSS的查询中使用类似语句。

SELECT * INTO mysqlTableName IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=tmp;USER=root;Pwd=123;]
FROM accessTablename;
------解决方案--------------------
如果表已经存在则使用下面语句。

insert into mysqlTableName IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=tmp;USER=root;Pwd=123;] select * from FROM accessTablename;