使用LOAD DATA和INSERT语句导入Mysql数据
在“MySQL数据库(表)的基本操作”一节中我们创建过一个会员注册表“Users”,这次我们就往这个表中以不同的方式导入数据。
INSERT语句
关于INSERT语句,这里简单讲述两个常用的句子结构。INSERT把新行插入到一个存在的表中,INSERTINTO... VALUES形式的语句是明确指定插入行的值,INSERT INTO SELECT形式是插入从其他表选择行的值。
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES (expression,...)
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
如果指定关键词LOW_PRIORITY或DELAYED时,INSERT的执行将等待表没有其他读写操作时进行。
如果指定关键词IGNORE,表中存在任何重复的PRIMARY或UNIQUE键的行将被忽略而不插入。如果不指定IGNORE关键词,若出现重复的行时会被放弃执行。
当使用INSERT INTO SELECT形式的语句时,需要满足下列条件:
(1) 查询不能包含一个ORDER BY子句。
(2)INSERT语句的目的表不能与SELECT查询部分的FROM表重复。
插入数据时常发生的错误:
(1)插入NULL到被声明了NOT NULL的列,列被设置为它的缺省值。
(2)将超出列范围的值设置给一个数字列,值被剪切为范围内适当的端点值。
(3)将数字列设成例如'10.34 a'的值,拖尾的垃圾被剥去并仍然是数字部分被插入。如果值根本不是一个数字,列被设置到0。
(4)把一个字符串插入到超过列的最大长度的一个CHAR、VARCHAR、TEXT或BLOB列中。值被截断为列的最大长度。
(5)把一个对列类型不合法的值插入到一个日期或时间列。列被设置为该列类型适当的“零”值。
案例:(使用INSERT语句向“Users”表中插入一条数据)
mysql>insert into users(username,userpassword,createdate) values("feihu", ->password("123456"),"2009.9.22 14:30:10"); Query OK,1 row affected (0.00 sec) 通过上面的语句已写入成功,再用select语句查验一下:
注:这里的password()函数是为了给输入的字符加密。当需要一次插入多条数据时,可这个方式:“insert into
users(username,userpassword,createdate)
values('value1','password1','date1'),('value2','password2','date2'),
('value3','password3','date3')”。
LOAD DATA批处理式导入数据
当写入多行数据时,使用INSERT就现得很累了。较之快捷的方法是将多行的数据写入一个文本文档,然后使用LOAD DATA语句读取数据,批量写入到数据表中。在创建这个文档时,要遵从以下规则:
(1)每行包含一个记录
(2)对应导入数据表的列次序,用定位符(tab)把值分开
(3)对于NULL值,可以使用\N(反斜线,字母N)表示。
LOAD DATA语法:
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']
]
(1) 如果指定了关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才会插入数据。load data low_priority local infile "D:/user.txt" into table users;
(2) 如果指定local关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。
(3) replace和ignore关键词控制对现有的唯一键记录的重复处理。如果你指定
了replace关键字,则重复的新行将代替已有的行。如果指定了ignore关键字,则会放弃写入有唯一键的现有行而继续下一行记录的写入操作。如果不
指定任何一个选项,当找到重复键时,出现一个错误,并且写入操作将被迫停止。例如:
load data local infile "D:/user.txt" replace into table users;
(4)两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。
(5)如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。其意义为:
TERMINATED BY 描述字段的分隔符,默认情况下是tab字符(\t)
[OPTIONALLY] ENCLOSED BY 描述的是字段的括起字符
ESCAPED BY 转义字符
用户在没有指定一个 FIELDS 子句,缺省时如同使用下列语句:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
(6)关键字LINES的两个子句的意义为:
STARTING BY 'string' 一条记录行的开始字符标记
TERMINATED BY 'string' 一条记录行的结束字符标记
如果用户没有指定一个 LINES 子句,缺省时如同使用下列语句:
LINES TERMINATED BY '\n' STARTING BY ''
案例:(用LOAD DATA语句导入10条数据)
D:/user.txt文件:
Xiaozhang 123456 2009.9.22 16:21:10
Xiaozhao 123456 2009.9.22 16:21:11
Xiaoming 123456 2009.9.22 16:21:12
Xiaohao 123456 2009.9.22 16:21:13
Xiaoqing 123456 2009.9.22 16:21:14
Xiaoren 123456 2009.9.22 16:21:15
Xiaozhen 123456 2009.9.22 16:21:16
Xiaojing 123456 2009.9.22 16:21:17
Xiaojin 123456 2009.9.22 16:21:18
Xiaohong 123456 2009.9.22 16:21:19
MySQL写入语句:
mysql>load data local infile “d:/user.txt” into table users; Query OK,10 rows affected (0.02 sec) Records:10 Deleted:0 Skipped:0 Warnings:0 出现上面语句,表示执行成功,再使用行成功,再使用select语句查看下结果:
与LOAD DATA语句相反意思的是SELECT ... INTO OUTFILE,即:从MySQL数据表中导出文本文档。请继续关注本站。
制作人:飞虎 无兄弟不编程!
====================================================
欢迎加QQ群进行更多交流:305397511 专注于php、mysql以及开源框架