1 insert語句
insert語句用於插入數據到表中,其基本語法有以下三種:
Syntax:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
SELECT ...
[ON DUPLICATE KEY UPDATE assignment_list]
-
其中
select...values
和insert...set
兩種語句都是將指定的數據插入到現成的表中,而insert...select
語句是將另外表中數據查出來並插入到現成的表中 -
partiion
子句代表可以將數據插入到指定的表分區中 -
table_name
代表將數據插入到的目標表 -
col_name
代表要插入指定數據的目標表列,如果是多列則用逗號隔開,如果目標表中的某些列沒有在insert語句中指定,則這些列會插入默認值,當然可以使用default顯式指定插入默認值 -
values
中除了可以指定確定的數值之外,開可以使用表達式expr
insert into tbl_name (col1,col2) values(15,col1*2) ##正確
insert into tbl_name (col1,col2) values(col1*2,15) ##錯誤
案例演示:
## 修改sid字段,添加auto_increment屬性
mysql> alter table students modify sid int auto_increment;
Query OK, 2 rows affected (0.23 sec)
Records: 2 Duplicates: 0 Warnings: 0
## 修改gender字段,添加默認值0
mysql> alter table students modify gender int default 0;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
## 向students表中插入一條數據
mysql> insert into students(sname) values("bbb");
Query OK, 1 row affected (0.04 sec)
mysql> insert into students(sid,sname) values(5,"ccc");
Query OK, 1 row affected (0.02 sec)
mysql> insert into students(sname) values("ddd");
Query OK, 1 row affected (0.07 sec)
mysql> insert into students(sid,sname) values(4,"dd");
Query OK, 1 row affected (0.10 sec)
mysql> insert into students values(3*3,'fff',1);
Query OK, 1 row affected (0.09 sec)
mysql> select * from students;
+-----+--------+--------+
| sid | sname | gender |
+-----+--------+--------+
| 1 | viktor | 1 |
| 2 | aaa | NULL |
| 3 | bbb | 0 |
| 4 | dd | 0 |
| 5 | ccc | 0 |
| 6 | ddd | 0 |
| 9 | fff | 1 |
+-----+--------+--------+
7 rows in set (0.00 sec)
inset...values
語句不光可以插入一條數據,也可以插入多條數據
insert into tbl_name(a,b,c) values(1,2,3)(4,5,6)
insert into students values(7,'abc'),(8,'bcd')
-
low_priority
關鍵詞代表如果有其他鏈接正在讀取目標表數據,則此insert語句需要等待讀取完成 -
low_priority
和high_priority
關鍵詞僅在MylSAM
,MEMORY
,MERGE
三種存儲引擎下才生效 -
ignore
關鍵詞代表insert語句如果違反主鍵和偽意見的約束條件,則不報錯而只產生警告信息,違反的行被丟棄,而不是整個語句回退;在數據類型轉換有問題時如果有ignore則只產生警告信息,而不是語句回退
mysql> select * from students;
+-----+--------+--------+
| sid | sname | gender |
+-----+--------+--------+
| 1 | viktor | 1 |
| 2 | aaa | NULL |
| 3 | bbb | 0 |
| 4 | dd | 0 |
| 5 | ccc | 0 |
| 6 | ddd | 0 |
| 9 | fff | 1 |
+-----+--------+--------+
7 rows in set (0.00 sec)
mysql> insert ignore into students values(1,'aa',1),(7,'cc',0);
Query OK, 1 row affected, 1 warning (0.10 sec)
Records: 2 Duplicates: 1 Warnings: 1
2 insert... select語句
用於從另外的表中查出記錄並插入到目標表中
insert into tbl_temp2(fld_id)
select tbl_temp1.fld_order_id
from tbl_temp1 where tbl_temp1.fld_order_id > 100;
當目標表和select語句中的表相同時,則會先將select語句的結果存放在臨時表中,再插入到目標表中(注意執行順序)
mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | NO | | NULL | |
| sname | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> desc students;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | NO | UNI | NULL | |
| gender | int(11) | YES | | 0 | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
## concat用來合並兩個字段
mysql> insert into student2(sid,sname) select sid,concat(sid,sname) from students where sid=1;
Query OK, 1 row affected (0.07 sec)
Records: 1 Duplicates: 0 Warnings: 0
## 當兩個表中的字段不匹配時,插入會出現錯誤
mysql> insert into student2 select * from students;
ERROR 1136 (21S01): Column count doesn't match value count at row 1
##選定兩個字段進行插入
mysql> insert into student2 select sid,sname from students;
Query OK, 8 rows affected (0.07 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> select * from student2;
+-----+---------+
| sid | sname |
+-----+---------+
| 1 | 1viktor |
| 2 | aaa |
| 3 | bbb |
| 7 | cc |
| 5 | ccc |
| 4 | dd |
| 6 | ddd |
| 9 | fff |
| 1 | viktor |
+-----+---------+
9 rows in set (0.00 sec)
3 insert on duplicate key update語句
當insert語句中使用on duplicate key update
子句時,如果碰到當前插入的數據違反主鍵或唯一鍵的唯一性約束,則insert會轉變成update語句修改對應的已經存在表中的這條數據。比如,如果a字段有唯一性約束且已經含有1這樣的記錄,則以下兩條語句的執行結果相同。
insert into table(a,b,c) values(1,2,3)
on duplicate key update c=c+1
update table set c=c+1 where a=1;
簡而言之,該語句可以解決插入的數據與表之間的沖突。
案例演示:
mysql> insert into student2(sid,sname) select sid,sname from students where sid<3;
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from student2;
+-----+--------+
| sid | sname |
+-----+--------+
| 1 | viktor |
| 2 | aaa |
+-----+--------+
2 rows in set (0.00 sec)
## 創建sname字段的unique索引
mysql> create unique index idx_1 on student2(sname);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | NO | | NULL | |
| sname | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert into student2(sid,sname) select sid,sname from students where sid=1;
ERROR 1062 (23000): Duplicate entry 'viktor' for key 'idx_1'
mysql> insert into student2(sid,sname) select sid,sname from students where sid=1 on duplicate key update sname='dabric';
Query OK, 2 rows affected (0.01 sec)
Records: 1 Duplicates: 1 Warnings: 0
mysql> select * from student2;
+-----+--------+
| sid | sname |
+-----+--------+
| 1 | dabric |
| 2 | aaa |
+-----+--------+
2 rows in set (0.00 sec)
mysql> insert into student values(1,'bb',0) on duplicate key update sname='b'sex=1;
4 練習
- 將如下數據插入到dept表中
1,'computer science'; 2,'education'; 4,'accounting'
- 根據
create table...like
語句創建teacher_backup表,並插入如下數據:
1,'susan'; 1; 2,'ruth'; 4; 3,'vivian', 4
- 將teacher_backup表的數據通過
insert...select
語句插入到teacher表中