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