[TOC] #### 1. insert 语法格式 --- **完整格式** ```sql insert [into] 表名[字段名1[, 字段名2]] value[s](值1, 值2),(值3, 值4); ``` **省略字段名** 省略字段名时,必须依次添加所有段的值 ```sql insert [into] 表名 value(值1, 值2[, ...]); ``` **只添加一条数据时,也可以使用 `insert ... set` 命令** 此方式无法插入空值 ```sql insert into 表名 set 字段名1=值[,字段名2=值]; ``` #### 2. insert 使用示例 --- **a. 省略字段名** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键且自增', `nickname` varchar(60) DEFAULT NULL COMMENT '用户昵称', `gender` tinyint(1) DEFAULT NULL COMMENT '性别', `age` mediumint(9) DEFAULT NULL COMMENT '年龄', `status` tinyint(1) DEFAULT '1' COMMENT '状态 0 关闭 1 开启 默认为 1', `create_time` int(11) DEFAULT NULL COMMENT '注册时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; ``` 特别注意:因为字段id会自动增长,设置为null即可 如果没有写出所有字段的值,会出现以下错误 1136 - Column count doesn't match value count at row 1(列计数与行的值计数不匹配) ```sql insert into user value(null, '张三', 1, 20, null, 1602295286); ```  **b. 给指定的字段添加数据,则没有被指定的字段必须有默认值** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键且自增', `nickname` varchar(60) NOT NULL COMMENT '用户昵称', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 0 关闭 1 开启 默认为 1', `create_time` int(11) DEFAULT NULL COMMENT '注册时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; ``` 没有默认值的字段必须给值:nickname 字段设置了 not null 且没有设置 default ```sql insert into user(`status`, `create_time`) value(1, 1602295286); ```  **c. 一次添加多条数据** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键且自增', `nickname` varchar(60) NOT NULL COMMENT '用户昵称', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 0 关闭 1 开启 默认为 1', `create_time` int(11) DEFAULT NULL COMMENT '注册时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; ``` ```sql insert into user(`nickname`, `status`) value('张大民', 1), ('小新', 0), ('小刚同学', 1); ``` **d. 添加一条数据的两种写法** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键且自增', `nickname` varchar(60) NOT NULL COMMENT '用户昵称', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 0 关闭 1 开启 默认为 1', `create_time` int(11) DEFAULT NULL COMMENT '注册时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; ``` ```sql insert into user(`nickname`, `status`) value('小王', 1); ``` ```sql insert into user set `nickname` = '大王', `status` = '0'; ```  #### 3. insert 常见用法 --- 不指定字段名,所有字段必须给值 ```sql insert into user value(null, '张三', '123456', '男', 20, 1602295286); ``` into 可以省略,但是一般都不省略 ```sql insert user value(null, '张三', '123456', '男', 20, 1602295286); ``` 指定部分字段添加,没有被指定的字段 `要么会自动增长,要么允许为 null,要么有默认值` ```sql insert into user(`nickname`, `password`, `gender`, `age`) value('张三', '123456', '男', 20); ``` 添加一条数据时也可以用 `insert ... set` ```sql insert into user set `nickname` = '大王', `status` = '0'; ``` 添加多条数据 ```sql insert into user(`nickname`, `status`) value('张大民', 1), ('小新', 0), ('小刚同学', 1); ``` #### 4. 优化 insert 语句 --- 当进行数据的 insert 操作时,可以考虑以下几种优化方案 **方案一:** 如果需要同时对一张表插入很多行数据时,应该尽量使用多个值的 insert 语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗,使得效率比分开执行的单个 insert 语句快 原始方式: 使用多个 insert 语句 ```sql insert into `user` values(1, 'Tom'); insert into `user` values(2, 'Cat'); insert into `user` values(3, 'Herry'); ``` 优化后的方案为: 一个 insert 语句插入多个值 ```sql insert into `user` values(1, 'Tom'),(2, 'Cat'),(3, 'Herry'); ``` **方案二:** 数据的有序插入: 能有序应尽量有序插入,可以降低数据库频繁构建索引次数,进而提高效率 原始方式: 主键索引值大小参差不齐,导致插入数据后会频繁构建索引,效率较低 ```sql insert into `user` values(4, 'Rose'); insert into `user` values(3, 'Herry'); insert into `user` values(5, 'Tim'); insert into `user` values(1, 'Tom'); insert into `user` values(2, 'Cat'); ``` 优化后 ```sql insert into `user` values(1, 'Tom'); insert into `user` values(2, 'Cat'); insert into `user` values(3, 'Herry'); insert into `user` values(4, 'Rose'); insert into `user` values(5, 'Tim'); ```