[TOC] #### 1. insert 語(yǔ)法格式 --- **完整格式** ```sql insert [into] 表名[字段名1[, 字段名2]] value[s](值1, 值2),(值3, 值4); ``` **省略字段名** 省略字段名時(shí),必須依次添加所有段的值 ```sql insert [into] 表名 value(值1, 值2[, ...]); ``` **只添加一條數(shù)據(jù)時(shí),也可以使用 `insert ... set` 命令** 此方式無(wú)法插入空值 ```sql insert into 表名 set 字段名1=值[,字段名2=值]; ``` #### 2. insert 使用示例 --- **a. 省略字段名** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶(hù)ID,主鍵且自增', `nickname` varchar(60) DEFAULT NULL COMMENT '用戶(hù)昵稱(chēng)', `gender` tinyint(1) DEFAULT NULL COMMENT '性別', `age` mediumint(9) DEFAULT NULL COMMENT '年齡', `status` tinyint(1) DEFAULT '1' COMMENT '狀態(tài) 0 關(guān)閉 1 開(kāi)啟 默認(rèn)為 1', `create_time` int(11) DEFAULT NULL COMMENT '注冊(cè)時(shí)間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶(hù)表'; ``` 特別注意:因?yàn)樽侄蝘d會(huì)自動(dòng)增長(zhǎng),設(shè)置為null即可 如果沒(méi)有寫(xiě)出所有字段的值,會(huì)出現(xiàn)以下錯(cuò)誤 1136 - Column count doesn't match value count at row 1(列計(jì)數(shù)與行的值計(jì)數(shù)不匹配) ```sql insert into user value(null, '張三', 1, 20, null, 1602295286); ``` ![](https://img.itqaq.com/art/content/dadf63ace0e2fbaa9866fdead13fa861.png) **b. 給指定的字段添加數(shù)據(jù),則沒(méi)有被指定的字段必須有默認(rèn)值** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶(hù)ID,主鍵且自增', `nickname` varchar(60) NOT NULL COMMENT '用戶(hù)昵稱(chēng)', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(tài) 0 關(guān)閉 1 開(kāi)啟 默認(rèn)為 1', `create_time` int(11) DEFAULT NULL COMMENT '注冊(cè)時(shí)間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶(hù)表'; ``` 沒(méi)有默認(rèn)值的字段必須給值:nickname 字段設(shè)置了 not null 且沒(méi)有設(shè)置 default ```sql insert into user(`status`, `create_time`) value(1, 1602295286); ``` ![](https://img.itqaq.com/art/content/a0e663473db8876b5cf368668c6b38a9.png) **c. 一次添加多條數(shù)據(jù)** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶(hù)ID,主鍵且自增', `nickname` varchar(60) NOT NULL COMMENT '用戶(hù)昵稱(chēng)', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(tài) 0 關(guān)閉 1 開(kāi)啟 默認(rèn)為 1', `create_time` int(11) DEFAULT NULL COMMENT '注冊(cè)時(shí)間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶(hù)表'; ``` ```sql insert into user(`nickname`, `status`) value('張大民', 1), ('小新', 0), ('小剛同學(xué)', 1); ``` **d. 添加一條數(shù)據(jù)的兩種寫(xiě)法** ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶(hù)ID,主鍵且自增', `nickname` varchar(60) NOT NULL COMMENT '用戶(hù)昵稱(chēng)', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(tài) 0 關(guān)閉 1 開(kāi)啟 默認(rèn)為 1', `create_time` int(11) DEFAULT NULL COMMENT '注冊(cè)時(shí)間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶(hù)表'; ``` ```sql insert into user(`nickname`, `status`) value('小王', 1); ``` ```sql insert into user set `nickname` = '大王', `status` = '0'; ``` ![](https://img.itqaq.com/art/content/6578f0ac45902aad077284e7ff417738.png) #### 3. insert 常見(jiàn)用法 --- 不指定字段名,所有字段必須給值 ```sql insert into user value(null, '張三', '123456', '男', 20, 1602295286); ``` into 可以省略,但是一般都不省略 ```sql insert user value(null, '張三', '123456', '男', 20, 1602295286); ``` 指定部分字段添加,沒(méi)有被指定的字段 `要么會(huì)自動(dòng)增長(zhǎng),要么允許為 null,要么有默認(rèn)值` ```sql insert into user(`nickname`, `password`, `gender`, `age`) value('張三', '123456', '男', 20); ``` 添加一條數(shù)據(jù)時(shí)也可以用 `insert ... set` ```sql insert into user set `nickname` = '大王', `status` = '0'; ``` 添加多條數(shù)據(jù) ```sql insert into user(`nickname`, `status`) value('張大民', 1), ('小新', 0), ('小剛同學(xué)', 1); ``` #### 4. 優(yōu)化 insert 語(yǔ)句 --- 當(dāng)進(jìn)行數(shù)據(jù)的 insert 操作時(shí),可以考慮以下幾種優(yōu)化方案 **方案一:** 如果需要同時(shí)對(duì)一張表插入很多行數(shù)據(jù)時(shí),應(yīng)該盡量使用多個(gè)值的 insert 語(yǔ)句,這種方式將大大縮減客戶(hù)端與數(shù)據(jù)庫(kù)之間的連接、關(guān)閉等消耗,使得效率比分開(kāi)執(zhí)行的單個(gè) insert 語(yǔ)句快 原始方式: 使用多個(gè) insert 語(yǔ)句 ```sql insert into `user` values(1, 'Tom'); insert into `user` values(2, 'Cat'); insert into `user` values(3, 'Herry'); ``` 優(yōu)化后的方案為: 一個(gè) insert 語(yǔ)句插入多個(gè)值 ```sql insert into `user` values(1, 'Tom'),(2, 'Cat'),(3, 'Herry'); ``` **方案二:** 數(shù)據(jù)的有序插入: 能有序應(yīng)盡量有序插入,可以降低數(shù)據(jù)庫(kù)頻繁構(gòu)建索引次數(shù),進(jìn)而提高效率 原始方式: 主鍵索引值大小參差不齊,導(dǎo)致插入數(shù)據(jù)后會(huì)頻繁構(gòu)建索引,效率較低 ```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'); ``` 優(yōu)化后 ```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'); ```