本篇文章介绍如何使用Insert
语句将数据插入到数据库。
数据插入
增删改查是数据库最常用的4个命令,插入算是第二常用,第一是SELECT
。插入数据的方式大概有4种
插入完整的行
插入行的一部分
插入多行数据(批量插入)
插入来自查询的数据
插入完整的行
使用Insert
将一条数据插入数据库是最简单也是最基本的操作。插入操作有两种写法。
顺序插入
顺序插入指的是:给出数据库名和需要插入数据,按照数据库字段排列顺序将数据插入数据库。
举个例子:
INSERT INTO `test`.`br_user` (`user_id`, `name`, `password`, `email`) VALUES (NULL, '星空幻颖', '123456', '123@xyz.com');
这条语句向用户表插入一条用户数据。给出了姓名、密码和邮箱3个字段,其中user_id
设为NULL
,这样Mysql
就会为我们自动创建一个自增长ID
这种顺序插入方式,必须和数据库字段一一对应的给出每个值,如果不想给值,可以设为NULL
(在数据允许的情况下)。由于位置匹配有要求,所以十分不安全。假设我们需要调增数据库结构时候,此语句插入数据将会发生错误。所以一般情况下我们不采用这种方式。
字段名+值插入
首先给个例子:
INSERT INTO `test`.`br_user` (`user_id`, `name`, `password`, `email`) VALUES (NULL, '星空幻颖', '123456', '123@xyz.com');
上面这条语句可以实现和顺序插入一样的功能,但我们发现它相比于顺序插入多给出了字段名,这种方式稍微复杂点儿,但是更为安全。
在插入数据行时候,Mysql
将会使用VALUES
的值填入对应字段名,例如星空幻颖将会被插入到name
字段。因为提供了字段名,所以字段的顺序也不一定需要按照数据库字段排序。
比方我们可以改写上面的SQL
语句:
INSERT INTO `test`.`br_user` (`user_id`, `password`, `email`, `name`) VALUES (NULL, '123456', '123@xyz.com', '星空幻颖');
我们将name
调增到了最后一个,但是这并不影响插入的结果。
甚至我们可以省去不写某些字段的值。(前提是字段允许为空或给出默认值的情况下)
INSERT INTO `test`.`br_user` (`password`, `name`) VALUES ('123456', '星空幻颖');
这样就安全了很多,即使我们调整数据库结构,新增一个字段,只要我们给出默认值就没有任何问题。
插入多行(批量插入)
Mysql
可以一次插入一条记录到数据库,也支持一次插入多条记录。只需要给出多个VALUES
使用逗号分隔(使用圆括号括起来),就可以一次插入多条记录。
INSERT INTO `test`.`br_user` (`user_id`, `password`, `email`, `name`)
VALUES (NULL, '123456', '1234@xyz.com', '星空幻颖'),
(NULL, '123456', '456@xyz.com', '星空幻颖2'),
(NULL, '123456', '789@xyz.com', '星空幻颖3'),
(NULL, '123456', '222@xyz.com', '星空幻颖4');
注意每条插入值的顺序要和你给出的字段顺序一致。
建议:在实际开发中,如果需要插入多条数据尽量使用批量插入。因为速度比一条一条插入块,性能更好。
插入检索出的数据
相同表结构
假设一个场景,我们有两张用户表,现在需要将其用户进行合并。首先我们可能会想到,将一张表数据查出,在放入到另外一张表合并。
但是有了插入检索出数据这个功能,就不需要这么麻烦了。Mysql
可以一次帮我们处理好。
给出两张表br_user
和br_user2
。为作区分,我把br_user2
姓名都改为了数字
INSERT INTO br_user(`password`, `email`, `name`) SELECT `password`, `email`, `name` FROM br_user2;
这条语句看上去好像是两个语句,但是他执行的是一个功能:将br_user2
的数据挪到了br_user
,一次性完成。
这里的插入多少记录到br_user
决定了你的SELECT
检索出来多少记录,如果一条也没有检索到,也不会报错,毕竟是合法的。当然,你也可以在SELECT
语句后面使用where
条件筛选数据。
提醒:这里复制数据到另外一个表,最好不要使用原来的表id
,防止和需要合并的表冲突,除非你确定不会冲突。还有字段类型,如果检索出来为字符串,而插入的为整型,Mysql
会帮你转换了
不同表结构
上面的例子我们为了简单明了,使用了两张完全相同结构的表。其实Mysql
根本不关心你两个表结构是否相同,也不关心你检索的字段是否相同,只关心你检索出来的字段顺序。简单来说,就是你检索出来的第一个字段就会被插入到第一个字段,(上方的password
会被插入到password
字段),以此类推。
为了演示这个效果,我们给出一个驴唇不对马嘴的两张表,来展示强烈对比:
还是那张br_user
,另外我们再给出一张br_region
地区表,完全不一样。
INSERT INTO br_user(`password`, `email`, `name`) SELECT `region_py`, `region_type`, `region_name` FROM br_region where region_id <10;
由于br_region
表数据量太大,我们只选取了region_id < 10
的,刚好说了一下上面的附带where
筛选。
这里region_py
被放入了password
;region_type
被放入了email
;region_name
被放入了name
。他们有啥关系?啥关系都没有。
这个为我们以后不同表之间转移数据提供了方便。你可以帮老板造假数据,来个10万用户。
星空幻颖,严颖
个人主页:segmentfault
天天找资料找不到,噗噗噗,分享一个资源合集网站:笔点资源
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。