5.insert语法

在 MySQL 中可以使用 INSERT 语句向数据库已有的表中插入一行或者多行元组数据。

--单条插入
INSERT INTO items(name,city,price,number,picture)  VALUES ('耐克运动鞋','广州',500,1000,'003.jpg');



--批量插入
INSERT INTO  items(name,city,price,number,picture) 
 VALUES
('耐克运动鞋','广州',500,1000,'003.jpg'),
('耐克运动鞋2','广州2',500,1000,'002.jpg');

-- 1、要根据情况设置一次批量插入的数据量,数据量大,在网络中传输的事件也越久,出现问题的可能也越大;

-- 2、除了网络,还要看机器配置,MySQL Server配置差了,sql写得再好,效率也不会太高;

-- 3、另外批量这个词,是指一次插入多条数据,我们除了要注意数据的条数,还要注意一条数据的大小,举个例子:比如一条记录的数据量有1M,10条记录的数据量就10M,这时一次插100条,100M数据,嘿嘿,你试试看!!所以,一次插入多少数据,一定要经过多次测试后再决定,别人1次插100条最优,你可能1次插10条才最优,没有绝对的最优值(批量插入未必总是比单条插入效率高)。

-- 4、数据库有个参数,max_allowed_packet,也就是每一个包(sql)命令大小,默认是1M,那么sql的长度大于1M就会报错。你可能会说,咱们把这个参数设成10M,100M不就行了???对呀,没毛病,但你是DBA吗?你有权限吗?即使调大这一个参数,你要知道影响的可不止你这一张表,而是整个DB Server,那影响的可是很多库,很多表。

-- 5、批量插入并不是越快越好,我们可能希望越快越好,这很正常,节省时间嘛。但是我们一定要知道,数据库分读写,有集群,这就意味着,需要同步!!!如果有分库分表分区的情况,如果短时间内插入的数据量太大,数据库同步可能就会比较迷了,读写数据不一致的情况在所难免了,可能会因为一张表的批量插入,影响整个DB服务组的同步,同时还要考虑并发问题,哈哈哈。 
-- REPLACE INSERT语句
-- 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。
-- 使用REPLACE INTO时,首先会根据主键或者唯一索引查看表中是否有该条记录,有的话则先删除,然后插入数据;没有该记录则直接插入。

CREATE TABLE `stu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cid` int(11) NOT NULL,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `cid` (`cid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
-- 其中id为自增主键,cid为唯一索引。

-- 插入两条数据
INSERT INTO stu(cid, name) VALUES(1, '1111');
INSERT INTO stu(cid, name) VALUES(2, '2222');
REPLACE INTO stu(cid, name) VALUES(3,'3333');


-- 1    1   1111
-- 2    2   2222
-- 3    3   3333


REPLACE INTO stu(cid, name) VALUES(3,'33331'); 
-- 使用REPLACE INTO时,首先会根据主键或者唯一索引查看表中是否有该条记录,有的话则先删除,然后插入数据;没有该记录则直接插入。
-- 原先id为3的记录变成了id为4了,说明原先id为3的记录先删除了,然后新插入了id为4(id自增)的新记录

-- 1    1   1111
-- 2    2   2222
-- 4    3   33331


--再次执行replace,id为4和cid为2的原记录都存在,则被删除。然后再插入这条新纪录
REPLACE INTO stu(id, cid, name) VALUES(4, 2,'42')
> Affected rows: 3
> 查询时间: 0.007s

-- 1    1   1111
-- 4    2   42
-- INSERT INTO…SELECT…FROM 语句用于快速地从一个或多个表中取出数据,并将这些数据作为行数据插入另一个表中。

-- SELECT 子句返回的是一个查询到的结果集,INSERT 语句将这个结果集插入指定表中,结果集中的每行数据的字段数、字段的数据类型都必须与被操作的表完全一致。
-- 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。另外,ON DUPLICATE KEY UPDATE不能写where条件。